提交 52cc4e6a 编写于 作者: S Sandeep Somavarapu

#108793 check casing and use proper extUri

上级 8b9b8df0
...@@ -16,7 +16,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; ...@@ -16,7 +16,7 @@ import { Registry } from 'vs/platform/registry/common/platform';
import { Disposable } from 'vs/base/common/lifecycle'; import { Disposable } from 'vs/base/common/lifecycle';
import { Emitter, Event } from 'vs/base/common/event'; import { Emitter, Event } from 'vs/base/common/event';
import { IFileService } from 'vs/platform/files/common/files'; import { IFileService } from 'vs/platform/files/common/files';
import { dirname } from 'vs/base/common/resources'; import { IExtUri } from 'vs/base/common/resources';
export class ConfigurationModel implements IConfigurationModel { export class ConfigurationModel implements IConfigurationModel {
...@@ -348,11 +348,12 @@ export class UserSettings extends Disposable { ...@@ -348,11 +348,12 @@ export class UserSettings extends Disposable {
constructor( constructor(
private readonly userSettingsResource: URI, private readonly userSettingsResource: URI,
private readonly scopes: ConfigurationScope[] | undefined, private readonly scopes: ConfigurationScope[] | undefined,
extUri: IExtUri,
private readonly fileService: IFileService private readonly fileService: IFileService
) { ) {
super(); super();
this.parser = new ConfigurationModelParser(this.userSettingsResource.toString(), this.scopes); this.parser = new ConfigurationModelParser(this.userSettingsResource.toString(), this.scopes);
this._register(this.fileService.watch(dirname(this.userSettingsResource))); this._register(this.fileService.watch(extUri.dirname(this.userSettingsResource)));
this._register(Event.filter(this.fileService.onDidFilesChange, e => e.contains(this.userSettingsResource))(() => this._onDidChange.fire())); this._register(Event.filter(this.fileService.onDidFilesChange, e => e.contains(this.userSettingsResource))(() => this._onDidChange.fire()));
} }
......
...@@ -12,6 +12,7 @@ import { Event, Emitter } from 'vs/base/common/event'; ...@@ -12,6 +12,7 @@ import { Event, Emitter } from 'vs/base/common/event';
import { URI } from 'vs/base/common/uri'; import { URI } from 'vs/base/common/uri';
import { IFileService } from 'vs/platform/files/common/files'; import { IFileService } from 'vs/platform/files/common/files';
import { RunOnceScheduler } from 'vs/base/common/async'; import { RunOnceScheduler } from 'vs/base/common/async';
import { extUriBiasedIgnorePathCase } from 'vs/base/common/resources';
export class ConfigurationService extends Disposable implements IConfigurationService, IDisposable { export class ConfigurationService extends Disposable implements IConfigurationService, IDisposable {
...@@ -29,7 +30,7 @@ export class ConfigurationService extends Disposable implements IConfigurationSe ...@@ -29,7 +30,7 @@ export class ConfigurationService extends Disposable implements IConfigurationSe
fileService: IFileService fileService: IFileService
) { ) {
super(); super();
this.userConfiguration = this._register(new UserSettings(this.settingsResource, undefined, fileService)); this.userConfiguration = this._register(new UserSettings(this.settingsResource, undefined, extUriBiasedIgnorePathCase, fileService));
this.configuration = new Configuration(new DefaultConfigurationModel(), new ConfigurationModel()); this.configuration = new Configuration(new DefaultConfigurationModel(), new ConfigurationModel());
this.reloadConfigurationScheduler = this._register(new RunOnceScheduler(() => this.reloadConfiguration(), 50)); this.reloadConfigurationScheduler = this._register(new RunOnceScheduler(() => this.reloadConfiguration(), 50));
......
...@@ -10,7 +10,7 @@ import { Emitter, Event } from 'vs/base/common/event'; ...@@ -10,7 +10,7 @@ import { Emitter, Event } from 'vs/base/common/event';
import { TernarySearchTree } from 'vs/base/common/map'; import { TernarySearchTree } from 'vs/base/common/map';
import { Schemas } from 'vs/base/common/network'; import { Schemas } from 'vs/base/common/network';
import { Counter } from 'vs/base/common/numbers'; import { Counter } from 'vs/base/common/numbers';
import { basename, basenameOrAuthority, dirname, isEqual, relativePath } from 'vs/base/common/resources'; import { basename, basenameOrAuthority, dirname, ExtUri, relativePath } from 'vs/base/common/resources';
import { compare } from 'vs/base/common/strings'; import { compare } from 'vs/base/common/strings';
import { withUndefinedAsNull } from 'vs/base/common/types'; import { withUndefinedAsNull } from 'vs/base/common/types';
import { URI } from 'vs/base/common/uri'; import { URI } from 'vs/base/common/uri';
...@@ -37,27 +37,27 @@ export interface IExtHostWorkspaceProvider { ...@@ -37,27 +37,27 @@ export interface IExtHostWorkspaceProvider {
resolveProxy(url: string): Promise<string | undefined>; resolveProxy(url: string): Promise<string | undefined>;
} }
function isFolderEqual(folderA: URI, folderB: URI): boolean { function isFolderEqual(folderA: URI, folderB: URI, extHostFileSystemInfo: IExtHostFileSystemInfo): boolean {
return isEqual(folderA, folderB); return new ExtUri(uri => ignorePathCasing(uri, extHostFileSystemInfo)).isEqual(folderA, folderB);
} }
function compareWorkspaceFolderByUri(a: vscode.WorkspaceFolder, b: vscode.WorkspaceFolder): number { function compareWorkspaceFolderByUri(a: vscode.WorkspaceFolder, b: vscode.WorkspaceFolder, extHostFileSystemInfo: IExtHostFileSystemInfo): number {
return isFolderEqual(a.uri, b.uri) ? 0 : compare(a.uri.toString(), b.uri.toString()); return isFolderEqual(a.uri, b.uri, extHostFileSystemInfo) ? 0 : compare(a.uri.toString(), b.uri.toString());
} }
function compareWorkspaceFolderByUriAndNameAndIndex(a: vscode.WorkspaceFolder, b: vscode.WorkspaceFolder): number { function compareWorkspaceFolderByUriAndNameAndIndex(a: vscode.WorkspaceFolder, b: vscode.WorkspaceFolder, extHostFileSystemInfo: IExtHostFileSystemInfo): number {
if (a.index !== b.index) { if (a.index !== b.index) {
return a.index < b.index ? -1 : 1; return a.index < b.index ? -1 : 1;
} }
return isFolderEqual(a.uri, b.uri) ? compare(a.name, b.name) : compare(a.uri.toString(), b.uri.toString()); return isFolderEqual(a.uri, b.uri, extHostFileSystemInfo) ? compare(a.name, b.name) : compare(a.uri.toString(), b.uri.toString());
} }
function delta(oldFolders: vscode.WorkspaceFolder[], newFolders: vscode.WorkspaceFolder[], compare: (a: vscode.WorkspaceFolder, b: vscode.WorkspaceFolder) => number): { removed: vscode.WorkspaceFolder[], added: vscode.WorkspaceFolder[] } { function delta(oldFolders: vscode.WorkspaceFolder[], newFolders: vscode.WorkspaceFolder[], compare: (a: vscode.WorkspaceFolder, b: vscode.WorkspaceFolder, extHostFileSystemInfo: IExtHostFileSystemInfo) => number, extHostFileSystemInfo: IExtHostFileSystemInfo): { removed: vscode.WorkspaceFolder[], added: vscode.WorkspaceFolder[] } {
const oldSortedFolders = oldFolders.slice(0).sort(compare); const oldSortedFolders = oldFolders.slice(0).sort((a, b) => compare(a, b, extHostFileSystemInfo));
const newSortedFolders = newFolders.slice(0).sort(compare); const newSortedFolders = newFolders.slice(0).sort((a, b) => compare(a, b, extHostFileSystemInfo));
return arrayDelta(oldSortedFolders, newSortedFolders, compare); return arrayDelta(oldSortedFolders, newSortedFolders, (a, b) => compare(a, b, extHostFileSystemInfo));
} }
function ignorePathCasing(uri: URI, extHostFileSystemInfo: IExtHostFileSystemInfo): boolean { function ignorePathCasing(uri: URI, extHostFileSystemInfo: IExtHostFileSystemInfo): boolean {
...@@ -87,7 +87,7 @@ class ExtHostWorkspaceImpl extends Workspace { ...@@ -87,7 +87,7 @@ class ExtHostWorkspaceImpl extends Workspace {
if (previousConfirmedWorkspace) { if (previousConfirmedWorkspace) {
folders.forEach((folderData, index) => { folders.forEach((folderData, index) => {
const folderUri = URI.revive(folderData.uri); const folderUri = URI.revive(folderData.uri);
const existingFolder = ExtHostWorkspaceImpl._findFolder(previousUnconfirmedWorkspace || previousConfirmedWorkspace, folderUri); const existingFolder = ExtHostWorkspaceImpl._findFolder(previousUnconfirmedWorkspace || previousConfirmedWorkspace, folderUri, extHostFileSystemInfo);
if (existingFolder) { if (existingFolder) {
existingFolder.name = folderData.name; existingFolder.name = folderData.name;
...@@ -106,15 +106,15 @@ class ExtHostWorkspaceImpl extends Workspace { ...@@ -106,15 +106,15 @@ class ExtHostWorkspaceImpl extends Workspace {
newWorkspaceFolders.sort((f1, f2) => f1.index < f2.index ? -1 : 1); newWorkspaceFolders.sort((f1, f2) => f1.index < f2.index ? -1 : 1);
const workspace = new ExtHostWorkspaceImpl(id, name, newWorkspaceFolders, configuration ? URI.revive(configuration) : null, !!isUntitled, uri => ignorePathCasing(uri, extHostFileSystemInfo)); const workspace = new ExtHostWorkspaceImpl(id, name, newWorkspaceFolders, configuration ? URI.revive(configuration) : null, !!isUntitled, uri => ignorePathCasing(uri, extHostFileSystemInfo));
const { added, removed } = delta(oldWorkspace ? oldWorkspace.workspaceFolders : [], workspace.workspaceFolders, compareWorkspaceFolderByUri); const { added, removed } = delta(oldWorkspace ? oldWorkspace.workspaceFolders : [], workspace.workspaceFolders, compareWorkspaceFolderByUri, extHostFileSystemInfo);
return { workspace, added, removed }; return { workspace, added, removed };
} }
private static _findFolder(workspace: ExtHostWorkspaceImpl, folderUriToFind: URI): MutableWorkspaceFolder | undefined { private static _findFolder(workspace: ExtHostWorkspaceImpl, folderUriToFind: URI, extHostFileSystemInfo: IExtHostFileSystemInfo): MutableWorkspaceFolder | undefined {
for (let i = 0; i < workspace.folders.length; i++) { for (let i = 0; i < workspace.folders.length; i++) {
const folder = workspace.workspaceFolders[i]; const folder = workspace.workspaceFolders[i];
if (isFolderEqual(folder.uri, folderUriToFind)) { if (isFolderEqual(folder.uri, folderUriToFind, extHostFileSystemInfo)) {
return folder; return folder;
} }
} }
...@@ -254,7 +254,7 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape, IExtHostWorkspac ...@@ -254,7 +254,7 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape, IExtHostWorkspac
const validatedDistinctWorkspaceFoldersToAdd: { uri: vscode.Uri, name?: string }[] = []; const validatedDistinctWorkspaceFoldersToAdd: { uri: vscode.Uri, name?: string }[] = [];
if (Array.isArray(workspaceFoldersToAdd)) { if (Array.isArray(workspaceFoldersToAdd)) {
workspaceFoldersToAdd.forEach(folderToAdd => { workspaceFoldersToAdd.forEach(folderToAdd => {
if (URI.isUri(folderToAdd.uri) && !validatedDistinctWorkspaceFoldersToAdd.some(f => isFolderEqual(f.uri, folderToAdd.uri))) { if (URI.isUri(folderToAdd.uri) && !validatedDistinctWorkspaceFoldersToAdd.some(f => isFolderEqual(f.uri, folderToAdd.uri, this._extHostFileSystemInfo))) {
validatedDistinctWorkspaceFoldersToAdd.push({ uri: folderToAdd.uri, name: folderToAdd.name || basenameOrAuthority(folderToAdd.uri) }); validatedDistinctWorkspaceFoldersToAdd.push({ uri: folderToAdd.uri, name: folderToAdd.name || basenameOrAuthority(folderToAdd.uri) });
} }
}); });
...@@ -283,13 +283,13 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape, IExtHostWorkspac ...@@ -283,13 +283,13 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape, IExtHostWorkspac
for (let i = 0; i < newWorkspaceFolders.length; i++) { for (let i = 0; i < newWorkspaceFolders.length; i++) {
const folder = newWorkspaceFolders[i]; const folder = newWorkspaceFolders[i];
if (newWorkspaceFolders.some((otherFolder, index) => index !== i && isFolderEqual(folder.uri, otherFolder.uri))) { if (newWorkspaceFolders.some((otherFolder, index) => index !== i && isFolderEqual(folder.uri, otherFolder.uri, this._extHostFileSystemInfo))) {
return false; // cannot add the same folder multiple times return false; // cannot add the same folder multiple times
} }
} }
newWorkspaceFolders.forEach((f, index) => f.index = index); // fix index newWorkspaceFolders.forEach((f, index) => f.index = index); // fix index
const { added, removed } = delta(currentWorkspaceFolders, newWorkspaceFolders, compareWorkspaceFolderByUriAndNameAndIndex); const { added, removed } = delta(currentWorkspaceFolders, newWorkspaceFolders, compareWorkspaceFolderByUriAndNameAndIndex, this._extHostFileSystemInfo);
if (added.length === 0 && removed.length === 0) { if (added.length === 0 && removed.length === 0) {
return false; // nothing actually changed return false; // nothing actually changed
} }
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import { URI } from 'vs/base/common/uri'; import { URI } from 'vs/base/common/uri';
import * as resources from 'vs/base/common/resources';
import { Event, Emitter } from 'vs/base/common/event'; import { Event, Emitter } from 'vs/base/common/event';
import * as errors from 'vs/base/common/errors'; import * as errors from 'vs/base/common/errors';
import { Disposable, IDisposable, dispose, toDisposable, MutableDisposable, combinedDisposable } from 'vs/base/common/lifecycle'; import { Disposable, IDisposable, dispose, toDisposable, MutableDisposable, combinedDisposable } from 'vs/base/common/lifecycle';
...@@ -22,6 +21,7 @@ import { equals } from 'vs/base/common/objects'; ...@@ -22,6 +21,7 @@ import { equals } from 'vs/base/common/objects';
import { IConfigurationModel } from 'vs/platform/configuration/common/configuration'; import { IConfigurationModel } from 'vs/platform/configuration/common/configuration';
import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService';
import { hash } from 'vs/base/common/hash'; import { hash } from 'vs/base/common/hash';
import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity';
export class UserConfiguration extends Disposable { export class UserConfiguration extends Disposable {
...@@ -36,10 +36,11 @@ export class UserConfiguration extends Disposable { ...@@ -36,10 +36,11 @@ export class UserConfiguration extends Disposable {
constructor( constructor(
private readonly userSettingsResource: URI, private readonly userSettingsResource: URI,
private readonly scopes: ConfigurationScope[] | undefined, private readonly scopes: ConfigurationScope[] | undefined,
private readonly fileService: IFileService private readonly fileService: IFileService,
private readonly uriIdentityService: IUriIdentityService,
) { ) {
super(); super();
this.userConfiguration.value = new UserSettings(this.userSettingsResource, this.scopes, this.fileService); this.userConfiguration.value = new UserSettings(this.userSettingsResource, this.scopes, uriIdentityService.extUri, this.fileService);
this._register(this.userConfiguration.value.onDidChange(() => this.reloadConfigurationScheduler.schedule())); this._register(this.userConfiguration.value.onDidChange(() => this.reloadConfigurationScheduler.schedule()));
this.reloadConfigurationScheduler = this._register(new RunOnceScheduler(() => this.reload().then(configurationModel => this._onDidChangeConfiguration.fire(configurationModel)), 50)); this.reloadConfigurationScheduler = this._register(new RunOnceScheduler(() => this.reload().then(configurationModel => this._onDidChangeConfiguration.fire(configurationModel)), 50));
} }
...@@ -53,9 +54,9 @@ export class UserConfiguration extends Disposable { ...@@ -53,9 +54,9 @@ export class UserConfiguration extends Disposable {
return this.userConfiguration.value!.loadConfiguration(); return this.userConfiguration.value!.loadConfiguration();
} }
const folder = resources.dirname(this.userSettingsResource); const folder = this.uriIdentityService.extUri.dirname(this.userSettingsResource);
const standAloneConfigurationResources: [string, URI][] = [TASKS_CONFIGURATION_KEY].map(name => ([name, resources.joinPath(folder, `${name}.json`)])); const standAloneConfigurationResources: [string, URI][] = [TASKS_CONFIGURATION_KEY].map(name => ([name, this.uriIdentityService.extUri.joinPath(folder, `${name}.json`)]));
const fileServiceBasedConfiguration = new FileServiceBasedConfiguration(folder.toString(), [this.userSettingsResource], standAloneConfigurationResources, this.scopes, this.fileService); const fileServiceBasedConfiguration = new FileServiceBasedConfiguration(folder.toString(), [this.userSettingsResource], standAloneConfigurationResources, this.scopes, this.fileService, this.uriIdentityService);
const configurationModel = await fileServiceBasedConfiguration.loadConfiguration(); const configurationModel = await fileServiceBasedConfiguration.loadConfiguration();
this.userConfiguration.value = fileServiceBasedConfiguration; this.userConfiguration.value = fileServiceBasedConfiguration;
...@@ -88,11 +89,12 @@ class FileServiceBasedConfiguration extends Disposable { ...@@ -88,11 +89,12 @@ class FileServiceBasedConfiguration extends Disposable {
private readonly settingsResources: URI[], private readonly settingsResources: URI[],
private readonly standAloneConfigurationResources: [string, URI][], private readonly standAloneConfigurationResources: [string, URI][],
private readonly scopes: ConfigurationScope[] | undefined, private readonly scopes: ConfigurationScope[] | undefined,
private fileService: IFileService private fileService: IFileService,
private uriIdentityService: IUriIdentityService
) { ) {
super(); super();
this.allResources = [...this.settingsResources, ...this.standAloneConfigurationResources.map(([, resource]) => resource)]; this.allResources = [...this.settingsResources, ...this.standAloneConfigurationResources.map(([, resource]) => resource)];
this._register(combinedDisposable(...this.allResources.map(resource => this.fileService.watch(resources.dirname(resource))))); this._register(combinedDisposable(...this.allResources.map(resource => this.fileService.watch(uriIdentityService.extUri.dirname(resource)))));
this._folderSettingsModelParser = new ConfigurationModelParser(name, this.scopes); this._folderSettingsModelParser = new ConfigurationModelParser(name, this.scopes);
this._standAloneConfigurations = []; this._standAloneConfigurations = [];
this._cache = new ConfigurationModel(); this._cache = new ConfigurationModel();
...@@ -165,7 +167,7 @@ class FileServiceBasedConfiguration extends Disposable { ...@@ -165,7 +167,7 @@ class FileServiceBasedConfiguration extends Disposable {
return true; return true;
} }
// One of the resource's parent got deleted // One of the resource's parent got deleted
if (this.allResources.some(resource => event.contains(resources.dirname(resource), FileChangeType.DELETED))) { if (this.allResources.some(resource => event.contains(this.uriIdentityService.extUri.dirname(resource), FileChangeType.DELETED))) {
return true; return true;
} }
return false; return false;
...@@ -194,6 +196,7 @@ export class RemoteUserConfiguration extends Disposable { ...@@ -194,6 +196,7 @@ export class RemoteUserConfiguration extends Disposable {
remoteAuthority: string, remoteAuthority: string,
configurationCache: IConfigurationCache, configurationCache: IConfigurationCache,
fileService: IFileService, fileService: IFileService,
uriIdentityService: IUriIdentityService,
remoteAgentService: IRemoteAgentService remoteAgentService: IRemoteAgentService
) { ) {
super(); super();
...@@ -201,7 +204,7 @@ export class RemoteUserConfiguration extends Disposable { ...@@ -201,7 +204,7 @@ export class RemoteUserConfiguration extends Disposable {
this._userConfiguration = this._cachedConfiguration = new CachedRemoteUserConfiguration(remoteAuthority, configurationCache); this._userConfiguration = this._cachedConfiguration = new CachedRemoteUserConfiguration(remoteAuthority, configurationCache);
remoteAgentService.getEnvironment().then(async environment => { remoteAgentService.getEnvironment().then(async environment => {
if (environment) { if (environment) {
const userConfiguration = this._register(new FileServiceBasedRemoteUserConfiguration(environment.settingsPath, REMOTE_MACHINE_SCOPES, this._fileService)); const userConfiguration = this._register(new FileServiceBasedRemoteUserConfiguration(environment.settingsPath, REMOTE_MACHINE_SCOPES, this._fileService, uriIdentityService));
this._register(userConfiguration.onDidChangeConfiguration(configurationModel => this.onDidUserConfigurationChange(configurationModel))); this._register(userConfiguration.onDidChangeConfiguration(configurationModel => this.onDidUserConfigurationChange(configurationModel)));
this._userConfigurationInitializationPromise = userConfiguration.initialize(); this._userConfigurationInitializationPromise = userConfiguration.initialize();
const configurationModel = await this._userConfigurationInitializationPromise; const configurationModel = await this._userConfigurationInitializationPromise;
...@@ -260,7 +263,8 @@ class FileServiceBasedRemoteUserConfiguration extends Disposable { ...@@ -260,7 +263,8 @@ class FileServiceBasedRemoteUserConfiguration extends Disposable {
constructor( constructor(
private readonly configurationResource: URI, private readonly configurationResource: URI,
private readonly scopes: ConfigurationScope[] | undefined, private readonly scopes: ConfigurationScope[] | undefined,
private readonly fileService: IFileService private readonly fileService: IFileService,
private readonly uriIdentityService: IUriIdentityService,
) { ) {
super(); super();
...@@ -283,7 +287,7 @@ class FileServiceBasedRemoteUserConfiguration extends Disposable { ...@@ -283,7 +287,7 @@ class FileServiceBasedRemoteUserConfiguration extends Disposable {
} }
private watchDirectory(): void { private watchDirectory(): void {
const directory = resources.dirname(this.configurationResource); const directory = this.uriIdentityService.extUri.dirname(this.configurationResource);
this.directoryWatcherDisposable = this.fileService.watch(directory); this.directoryWatcherDisposable = this.fileService.watch(directory);
} }
...@@ -713,11 +717,12 @@ export class FolderConfiguration extends Disposable implements IFolderConfigurat ...@@ -713,11 +717,12 @@ export class FolderConfiguration extends Disposable implements IFolderConfigurat
configFolderRelativePath: string, configFolderRelativePath: string,
private readonly workbenchState: WorkbenchState, private readonly workbenchState: WorkbenchState,
fileService: IFileService, fileService: IFileService,
uriIdentityService: IUriIdentityService,
private readonly configurationCache: IConfigurationCache private readonly configurationCache: IConfigurationCache
) { ) {
super(); super();
this.configurationFolder = resources.joinPath(workspaceFolder.uri, configFolderRelativePath); this.configurationFolder = uriIdentityService.extUri.joinPath(workspaceFolder.uri, configFolderRelativePath);
this.cachedFolderConfiguration = new CachedFolderConfiguration(workspaceFolder.uri, configFolderRelativePath, configurationCache); this.cachedFolderConfiguration = new CachedFolderConfiguration(workspaceFolder.uri, configFolderRelativePath, configurationCache);
if (this.configurationCache.needsCaching(workspaceFolder.uri)) { if (this.configurationCache.needsCaching(workspaceFolder.uri)) {
this.folderConfiguration = this.cachedFolderConfiguration; this.folderConfiguration = this.cachedFolderConfiguration;
...@@ -725,12 +730,12 @@ export class FolderConfiguration extends Disposable implements IFolderConfigurat ...@@ -725,12 +730,12 @@ export class FolderConfiguration extends Disposable implements IFolderConfigurat
.then(() => { .then(() => {
this.folderConfiguration.dispose(); this.folderConfiguration.dispose();
this.folderConfigurationDisposable.dispose(); this.folderConfigurationDisposable.dispose();
this.folderConfiguration = this.createFileServiceBasedConfiguration(fileService); this.folderConfiguration = this.createFileServiceBasedConfiguration(fileService, uriIdentityService);
this._register(this.folderConfiguration.onDidChange(e => this.onDidFolderConfigurationChange())); this._register(this.folderConfiguration.onDidChange(e => this.onDidFolderConfigurationChange()));
this.onDidFolderConfigurationChange(); this.onDidFolderConfigurationChange();
}); });
} else { } else {
this.folderConfiguration = this.createFileServiceBasedConfiguration(fileService); this.folderConfiguration = this.createFileServiceBasedConfiguration(fileService, uriIdentityService);
this.folderConfigurationDisposable = this._register(this.folderConfiguration.onDidChange(e => this.onDidFolderConfigurationChange())); this.folderConfigurationDisposable = this._register(this.folderConfiguration.onDidChange(e => this.onDidFolderConfigurationChange()));
} }
} }
...@@ -748,10 +753,10 @@ export class FolderConfiguration extends Disposable implements IFolderConfigurat ...@@ -748,10 +753,10 @@ export class FolderConfiguration extends Disposable implements IFolderConfigurat
this._onDidChange.fire(); this._onDidChange.fire();
} }
private createFileServiceBasedConfiguration(fileService: IFileService) { private createFileServiceBasedConfiguration(fileService: IFileService, uriIdentityService: IUriIdentityService) {
const settingsResources = [resources.joinPath(this.configurationFolder, `${FOLDER_SETTINGS_NAME}.json`)]; const settingsResources = [uriIdentityService.extUri.joinPath(this.configurationFolder, `${FOLDER_SETTINGS_NAME}.json`)];
const standAloneConfigurationResources: [string, URI][] = [TASKS_CONFIGURATION_KEY, LAUNCH_CONFIGURATION_KEY].map(name => ([name, resources.joinPath(this.configurationFolder, `${name}.json`)])); const standAloneConfigurationResources: [string, URI][] = [TASKS_CONFIGURATION_KEY, LAUNCH_CONFIGURATION_KEY].map(name => ([name, uriIdentityService.extUri.joinPath(this.configurationFolder, `${name}.json`)]));
return new FileServiceBasedConfiguration(this.configurationFolder.toString(), settingsResources, standAloneConfigurationResources, WorkbenchState.WORKSPACE === this.workbenchState ? FOLDER_SCOPES : WORKSPACE_SCOPES, fileService); return new FileServiceBasedConfiguration(this.configurationFolder.toString(), settingsResources, standAloneConfigurationResources, WorkbenchState.WORKSPACE === this.workbenchState ? FOLDER_SCOPES : WORKSPACE_SCOPES, fileService, uriIdentityService);
} }
private updateCache(): Promise<void> { private updateCache(): Promise<void> {
......
...@@ -23,7 +23,6 @@ import { ConfigurationEditingService, EditableConfigurationTarget } from 'vs/wor ...@@ -23,7 +23,6 @@ import { ConfigurationEditingService, EditableConfigurationTarget } from 'vs/wor
import { WorkspaceConfiguration, FolderConfiguration, RemoteUserConfiguration, UserConfiguration } from 'vs/workbench/services/configuration/browser/configuration'; import { WorkspaceConfiguration, FolderConfiguration, RemoteUserConfiguration, UserConfiguration } from 'vs/workbench/services/configuration/browser/configuration';
import { JSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditingService'; import { JSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditingService';
import { IJSONSchema, IJSONSchemaMap } from 'vs/base/common/jsonSchema'; import { IJSONSchema, IJSONSchemaMap } from 'vs/base/common/jsonSchema';
import { isEqual, dirname } from 'vs/base/common/resources';
import { mark } from 'vs/base/common/performance'; import { mark } from 'vs/base/common/performance';
import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService';
import { IFileService } from 'vs/platform/files/common/files'; import { IFileService } from 'vs/platform/files/common/files';
...@@ -103,10 +102,10 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat ...@@ -103,10 +102,10 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat
this.logService = logService; this.logService = logService;
this._configuration = new Configuration(this.defaultConfiguration, new ConfigurationModel(), new ConfigurationModel(), new ConfigurationModel(), new ResourceMap(), new ConfigurationModel(), new ResourceMap<ConfigurationModel>(), this.workspace); this._configuration = new Configuration(this.defaultConfiguration, new ConfigurationModel(), new ConfigurationModel(), new ConfigurationModel(), new ResourceMap(), new ConfigurationModel(), new ResourceMap<ConfigurationModel>(), this.workspace);
this.cachedFolderConfigs = new ResourceMap<FolderConfiguration>(); this.cachedFolderConfigs = new ResourceMap<FolderConfiguration>();
this.localUserConfiguration = this._register(new UserConfiguration(environmentService.settingsResource, remoteAuthority ? LOCAL_MACHINE_SCOPES : undefined, fileService)); this.localUserConfiguration = this._register(new UserConfiguration(environmentService.settingsResource, remoteAuthority ? LOCAL_MACHINE_SCOPES : undefined, fileService, uriIdentityService));
this._register(this.localUserConfiguration.onDidChangeConfiguration(userConfiguration => this.onLocalUserConfigurationChanged(userConfiguration))); this._register(this.localUserConfiguration.onDidChangeConfiguration(userConfiguration => this.onLocalUserConfigurationChanged(userConfiguration)));
if (remoteAuthority) { if (remoteAuthority) {
const remoteUserConfiguration = this.remoteUserConfiguration = this._register(new RemoteUserConfiguration(remoteAuthority, configurationCache, fileService, remoteAgentService)); const remoteUserConfiguration = this.remoteUserConfiguration = this._register(new RemoteUserConfiguration(remoteAuthority, configurationCache, fileService, uriIdentityService, remoteAgentService));
this._register(remoteUserConfiguration.onDidInitialize(remoteUserConfigurationModel => { this._register(remoteUserConfiguration.onDidInitialize(remoteUserConfigurationModel => {
this._register(remoteUserConfiguration.onDidChangeConfiguration(remoteUserConfigurationModel => this.onRemoteUserConfigurationChanged(remoteUserConfigurationModel))); this._register(remoteUserConfiguration.onDidChangeConfiguration(remoteUserConfigurationModel => this.onRemoteUserConfigurationChanged(remoteUserConfigurationModel)));
this.onRemoteUserConfigurationChanged(remoteUserConfigurationModel); this.onRemoteUserConfigurationChanged(remoteUserConfigurationModel);
...@@ -179,7 +178,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat ...@@ -179,7 +178,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat
public isCurrentWorkspace(workspaceIdentifier: ISingleFolderWorkspaceIdentifier | IWorkspaceIdentifier): boolean { public isCurrentWorkspace(workspaceIdentifier: ISingleFolderWorkspaceIdentifier | IWorkspaceIdentifier): boolean {
switch (this.getWorkbenchState()) { switch (this.getWorkbenchState()) {
case WorkbenchState.FOLDER: case WorkbenchState.FOLDER:
return isSingleFolderWorkspaceIdentifier(workspaceIdentifier) && isEqual(workspaceIdentifier, this.workspace.folders[0].uri); return isSingleFolderWorkspaceIdentifier(workspaceIdentifier) && this.uriIdentityService.extUri.isEqual(workspaceIdentifier, this.workspace.folders[0].uri);
case WorkbenchState.WORKSPACE: case WorkbenchState.WORKSPACE:
return isWorkspaceIdentifier(workspaceIdentifier) && this.workspace.id === workspaceIdentifier.id; return isWorkspaceIdentifier(workspaceIdentifier) && this.workspace.id === workspaceIdentifier.id;
} }
...@@ -216,7 +215,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat ...@@ -216,7 +215,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat
// Recompute current workspace folders if we have folders to add // Recompute current workspace folders if we have folders to add
const workspaceConfigPath = this.getWorkspace().configuration!; const workspaceConfigPath = this.getWorkspace().configuration!;
const workspaceConfigFolder = dirname(workspaceConfigPath); const workspaceConfigFolder = this.uriIdentityService.extUri.dirname(workspaceConfigPath);
currentWorkspaceFolders = toWorkspaceFolders(newStoredFolders, workspaceConfigPath, this.uriIdentityService.extUri); currentWorkspaceFolders = toWorkspaceFolders(newStoredFolders, workspaceConfigPath, this.uriIdentityService.extUri);
const currentWorkspaceFolderUris = currentWorkspaceFolders.map(folder => folder.uri); const currentWorkspaceFolderUris = currentWorkspaceFolders.map(folder => folder.uri);
...@@ -265,7 +264,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat ...@@ -265,7 +264,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat
} }
private contains(resources: URI[], toCheck: URI): boolean { private contains(resources: URI[], toCheck: URI): boolean {
return resources.some(resource => isEqual(resource, toCheck)); return resources.some(resource => this.uriIdentityService.extUri.isEqual(resource, toCheck));
} }
// Workspace Configuration Service Impl // Workspace Configuration Service Impl
...@@ -675,7 +674,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat ...@@ -675,7 +674,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat
return Promise.all([...folders.map(folder => { return Promise.all([...folders.map(folder => {
let folderConfiguration = this.cachedFolderConfigs.get(folder.uri); let folderConfiguration = this.cachedFolderConfigs.get(folder.uri);
if (!folderConfiguration) { if (!folderConfiguration) {
folderConfiguration = new FolderConfiguration(folder, FOLDER_CONFIG_FOLDER_NAME, this.getWorkbenchState(), this.fileService, this.configurationCache); folderConfiguration = new FolderConfiguration(folder, FOLDER_CONFIG_FOLDER_NAME, this.getWorkbenchState(), this.fileService, this.uriIdentityService, this.configurationCache);
this._register(folderConfiguration.onDidChange(() => this.onWorkspaceFolderConfigurationChanged(folder))); this._register(folderConfiguration.onDidChange(() => this.onWorkspaceFolderConfigurationChanged(folder)));
this.cachedFolderConfigs.set(folder.uri, this._register(folderConfiguration)); this.cachedFolderConfigs.set(folder.uri, this._register(folderConfiguration));
} }
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
import * as nls from 'vs/nls'; import * as nls from 'vs/nls';
import { URI } from 'vs/base/common/uri'; import { URI } from 'vs/base/common/uri';
import * as resources from 'vs/base/common/resources';
import * as json from 'vs/base/common/json'; import * as json from 'vs/base/common/json';
import { setProperty } from 'vs/base/common/jsonEdit'; import { setProperty } from 'vs/base/common/jsonEdit';
import { Queue } from 'vs/base/common/async'; import { Queue } from 'vs/base/common/async';
...@@ -29,6 +28,7 @@ import { INotificationService, Severity } from 'vs/platform/notification/common/ ...@@ -29,6 +28,7 @@ import { INotificationService, Severity } from 'vs/platform/notification/common/
import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences';
import { withUndefinedAsNull, withNullAsUndefined } from 'vs/base/common/types'; import { withUndefinedAsNull, withNullAsUndefined } from 'vs/base/common/types';
import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService';
import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity';
export const enum ConfigurationEditingErrorCode { export const enum ConfigurationEditingErrorCode {
...@@ -155,7 +155,8 @@ export class ConfigurationEditingService { ...@@ -155,7 +155,8 @@ export class ConfigurationEditingService {
@INotificationService private readonly notificationService: INotificationService, @INotificationService private readonly notificationService: INotificationService,
@IPreferencesService private readonly preferencesService: IPreferencesService, @IPreferencesService private readonly preferencesService: IPreferencesService,
@IEditorService private readonly editorService: IEditorService, @IEditorService private readonly editorService: IEditorService,
@IRemoteAgentService remoteAgentService: IRemoteAgentService @IRemoteAgentService remoteAgentService: IRemoteAgentService,
@IUriIdentityService private readonly uriIdentityService: IUriIdentityService
) { ) {
this.queue = new Queue<void>(); this.queue = new Queue<void>();
remoteAgentService.getEnvironment().then(environment => { remoteAgentService.getEnvironment().then(environment => {
...@@ -437,8 +438,8 @@ export class ConfigurationEditingService { ...@@ -437,8 +438,8 @@ export class ConfigurationEditingService {
} }
private defaultResourceValue(resource: URI): string { private defaultResourceValue(resource: URI): string {
const basename: string = resources.basename(resource); const basename: string = this.uriIdentityService.extUri.basename(resource);
const configurationValue: string = basename.substr(0, basename.length - resources.extname(resource).length); const configurationValue: string = basename.substr(0, basename.length - this.uriIdentityService.extUri.extname(resource).length);
switch (configurationValue) { switch (configurationValue) {
case TASKS_CONFIGURATION_KEY: return TASKS_DEFAULT; case TASKS_CONFIGURATION_KEY: return TASKS_DEFAULT;
default: return '{}'; default: return '{}';
...@@ -585,7 +586,7 @@ export class ConfigurationEditingService { ...@@ -585,7 +586,7 @@ export class ConfigurationEditingService {
private getConfigurationFileResource(target: EditableConfigurationTarget, relativePath: string, resource: URI | null | undefined): URI | null { private getConfigurationFileResource(target: EditableConfigurationTarget, relativePath: string, resource: URI | null | undefined): URI | null {
if (target === EditableConfigurationTarget.USER_LOCAL) { if (target === EditableConfigurationTarget.USER_LOCAL) {
if (relativePath) { if (relativePath) {
return resources.joinPath(resources.dirname(this.environmentService.settingsResource), relativePath); return this.uriIdentityService.extUri.joinPath(this.uriIdentityService.extUri.dirname(this.environmentService.settingsResource), relativePath);
} else { } else {
return this.environmentService.settingsResource; return this.environmentService.settingsResource;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册