Skip to content

Commit

Permalink
Showing 3 changed files with 45 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -16,7 +16,7 @@ import { IConfigurationChangeEvent, ConfigurationTarget, IConfigurationOverrides
import { Configuration } from 'vs/workbench/services/configuration/common/configurationModels';
import { FOLDER_CONFIG_FOLDER_NAME, defaultSettingsSchemaId, userSettingsSchemaId, workspaceSettingsSchemaId, folderSettingsSchemaId, IConfigurationCache, machineSettingsSchemaId, LOCAL_MACHINE_SCOPES, IWorkbenchConfigurationService } from 'vs/workbench/services/configuration/common/configuration';
import { Registry } from 'vs/platform/registry/common/platform';
import { IConfigurationRegistry, Extensions, allSettings, windowSettings, resourceSettings, applicationSettings, machineSettings, machineOverridableSettings } from 'vs/platform/configuration/common/configurationRegistry';
import { IConfigurationRegistry, Extensions, allSettings, windowSettings, resourceSettings, applicationSettings, machineSettings, machineOverridableSettings, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry';
import { IWorkspaceIdentifier, isWorkspaceIdentifier, IStoredWorkspaceFolder, isStoredWorkspaceFolder, IWorkspaceFolderCreationData, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, IWorkspaceInitializationPayload, isSingleFolderWorkspaceInitializationPayload, ISingleFolderWorkspaceInitializationPayload, IEmptyWorkspaceInitializationPayload, useSlashForPath, getStoredWorkspaceFolder } from 'vs/platform/workspaces/common/workspaces';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { ConfigurationEditingService, EditableConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditingService';
@@ -70,6 +70,8 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat
protected readonly _onDidChangeWorkbenchState: Emitter<WorkbenchState> = this._register(new Emitter<WorkbenchState>());
public readonly onDidChangeWorkbenchState: Event<WorkbenchState> = this._onDidChangeWorkbenchState.event;

private readonly configurationRegistry: IConfigurationRegistry;

// TODO@sandeep debt with cyclic dependencies
private configurationEditingService!: ConfigurationEditingService;
private jsonEditingService!: JSONEditingService;
@@ -86,11 +88,11 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat
) {
super();

const configurationRegistry = Registry.as<IConfigurationRegistry>(Extensions.Configuration);
this.configurationRegistry = Registry.as<IConfigurationRegistry>(Extensions.Configuration);
// register defaults before creating default configuration model
// so that the model is not required to be updated after registering
if (environmentService.options?.configurationDefaults) {
configurationRegistry.registerDefaultConfigurations([environmentService.options.configurationDefaults]);
this.configurationRegistry.registerDefaultConfigurations([environmentService.options.configurationDefaults]);
}

this.initRemoteUserConfigurationBarrier = new Barrier();
@@ -123,7 +125,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat
});
}));

this._register(configurationRegistry.onDidUpdateConfiguration(configurationProperties => this.onDefaultConfigurationChanged(configurationProperties)));
this._register(this.configurationRegistry.onDidUpdateConfiguration(configurationProperties => this.onDefaultConfigurationChanged(configurationProperties)));

this.workspaceEditingQueue = new Queue<void>();
}
@@ -802,8 +804,14 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat

private toEditableConfigurationTarget(target: ConfigurationTarget, key: string): EditableConfigurationTarget | null {
if (target === ConfigurationTarget.USER) {
if (this.inspect(key).userRemoteValue !== undefined) {
return EditableConfigurationTarget.USER_REMOTE;
if (this.remoteUserConfiguration) {
const scope = this.configurationRegistry.getConfigurationProperties()[key]?.scope;
if (scope === ConfigurationScope.MACHINE || scope === ConfigurationScope.MACHINE_OVERRIDABLE) {
return EditableConfigurationTarget.USER_REMOTE;
}
if (this.inspect(key).userRemoteValue !== undefined) {
return EditableConfigurationTarget.USER_REMOTE;
}
}
return EditableConfigurationTarget.USER_LOCAL;
}
Original file line number Diff line number Diff line change
@@ -2029,6 +2029,33 @@ suite('WorkspaceConfigurationService - Remote Folder', () => {
assert.equal(testObject.getValue('configurationService.remote.machineOverridableSetting'), 'isSet');
});

test('non machine setting is written in local settings', async () => {
registerRemoteFileSystemProvider();
resolveRemoteEnvironment();
await initialize();
await testObject.updateValue('configurationService.remote.applicationSetting', 'applicationValue');
await testObject.reloadConfiguration();
assert.equal(testObject.inspect('configurationService.remote.applicationSetting').userLocalValue, 'applicationValue');
});

test('machine setting is written in remote settings', async () => {
registerRemoteFileSystemProvider();
resolveRemoteEnvironment();
await initialize();
await testObject.updateValue('configurationService.remote.machineSetting', 'machineValue');
await testObject.reloadConfiguration();
assert.equal(testObject.inspect('configurationService.remote.machineSetting').userRemoteValue, 'machineValue');
});

test('machine overridable setting is written in remote settings', async () => {
registerRemoteFileSystemProvider();
resolveRemoteEnvironment();
await initialize();
await testObject.updateValue('configurationService.remote.machineOverridableSetting', 'machineValue');
await testObject.reloadConfiguration();
assert.equal(testObject.inspect('configurationService.remote.machineOverridableSetting').userRemoteValue, 'machineValue');
});

test('machine settings in local user settings does not override defaults after defalts are registered ', async () => {
fs.writeFileSync(globalSettingsFile, '{ "configurationService.remote.newMachineSetting": "userValue" }');
registerRemoteFileSystemProvider();
@@ -2048,7 +2075,7 @@ suite('WorkspaceConfigurationService - Remote Folder', () => {
assert.equal(testObject.getValue('configurationService.remote.newMachineSetting'), 'isSet');
});

test('machine overridable settings in local user settings does not override defaults after defalts are registered ', async () => {
test('machine overridable settings in local user settings does not override defaults after defaults are registered ', async () => {
fs.writeFileSync(globalSettingsFile, '{ "configurationService.remote.newMachineOverridableSetting": "userValue" }');
registerRemoteFileSystemProvider();
resolveRemoteEnvironment();
4 changes: 3 additions & 1 deletion src/vs/workbench/test/browser/workbenchTestServices.ts
Original file line number Diff line number Diff line change
@@ -23,7 +23,7 @@ import { IUntitledTextEditorService, UntitledTextEditorService } from 'vs/workbe
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
import { ILifecycleService, BeforeShutdownEvent, ShutdownReason, StartupKind, LifecyclePhase, WillShutdownEvent } from 'vs/workbench/services/lifecycle/common/lifecycle';
import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection';
import { FileOperationEvent, IFileService, IFileStat, IResolveFileResult, FileChangesEvent, IResolveFileOptions, ICreateFileOptions, IFileSystemProvider, FileSystemProviderCapabilities, IFileChange, IWatchOptions, IStat, FileType, FileDeleteOptions, FileOverwriteOptions, FileWriteOptions, FileOpenOptions, IFileStatWithMetadata, IResolveMetadataFileOptions, IWriteFileOptions, IReadFileOptions, IFileContent, IFileStreamContent, FileOperationError, IFileSystemProviderWithFileReadStreamCapability } from 'vs/platform/files/common/files';
import { FileOperationEvent, IFileService, IFileStat, IResolveFileResult, FileChangesEvent, IResolveFileOptions, ICreateFileOptions, IFileSystemProvider, FileSystemProviderCapabilities, IFileChange, IWatchOptions, IStat, FileType, FileDeleteOptions, FileOverwriteOptions, FileWriteOptions, FileOpenOptions, IFileStatWithMetadata, IResolveMetadataFileOptions, IWriteFileOptions, IReadFileOptions, IFileContent, IFileStreamContent, FileOperationError, IFileSystemProviderWithFileReadStreamCapability, FileReadStreamOptions } from 'vs/platform/files/common/files';
import { IModelService } from 'vs/editor/common/services/modelService';
import { ModeServiceImpl } from 'vs/editor/common/services/modeServiceImpl';
import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl';
@@ -993,6 +993,8 @@ export class RemoteFileSystemProvider implements IFileSystemProvider {
read(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise<number> { return this.diskFileSystemProvider.read!(fd, pos, data, offset, length); }
write(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise<number> { return this.diskFileSystemProvider.write!(fd, pos, data, offset, length); }

readFileStream(resource: URI, opts: FileReadStreamOptions, token: CancellationToken): ReadableStreamEvents<Uint8Array> { return this.diskFileSystemProvider.readFileStream!(this.toFileResource(resource), opts, token); }

private toFileResource(resource: URI): URI { return resource.with({ scheme: Schemas.file, authority: '' }); }
}

0 comments on commit f158da4

Please sign in to comment.