From 54003f85adfd4b48dbcaefdce355ba15b6ee2e20 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 17 Jun 2022 09:40:36 +0200 Subject: [PATCH] debt - cleanup config migration (#152425) --- .../browser/workbench.contribution.ts | 8 +- src/vs/workbench/common/configuration.ts | 91 +++++++++++++++++ .../common/configurationMigration.ts | 99 ------------------- .../browser/editorSettingsMigration.ts | 2 +- .../search/browser/search.contribution.ts | 2 +- 5 files changed, 99 insertions(+), 103 deletions(-) delete mode 100644 src/vs/workbench/common/configurationMigration.ts diff --git a/src/vs/workbench/browser/workbench.contribution.ts b/src/vs/workbench/browser/workbench.contribution.ts index e1a960c81de..017f41f481a 100644 --- a/src/vs/workbench/browser/workbench.contribution.ts +++ b/src/vs/workbench/browser/workbench.contribution.ts @@ -7,15 +7,19 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { localize } from 'vs/nls'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { isMacintosh, isWindows, isLinux, isWeb, isNative } from 'vs/base/common/platform'; -import { workbenchConfigurationNodeBase } from 'vs/workbench/common/configuration'; +import { ConfigurationMigrationWorkbenchContribution, workbenchConfigurationNodeBase } from 'vs/workbench/common/configuration'; import { isStandalone } from 'vs/base/browser/browser'; -import 'vs/workbench/common/configurationMigration'; +import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; +import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; const registry = Registry.as(ConfigurationExtensions.Configuration); // Configuration (function registerConfiguration(): void { + // Migration support + Registry.as(WorkbenchExtensions.Workbench).registerWorkbenchContribution(ConfigurationMigrationWorkbenchContribution, LifecyclePhase.Eventually); + // Workbench registry.registerConfiguration({ ...workbenchConfigurationNodeBase, diff --git a/src/vs/workbench/common/configuration.ts b/src/vs/workbench/common/configuration.ts index 8405ae63a5f..d25d5728cef 100644 --- a/src/vs/workbench/common/configuration.ts +++ b/src/vs/workbench/common/configuration.ts @@ -5,6 +5,12 @@ import { localize } from 'vs/nls'; import { IConfigurationNode } from 'vs/platform/configuration/common/configurationRegistry'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; +import { IWorkspaceContextService, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; +import { ConfigurationTarget, IConfigurationOverrides, IConfigurationService, IConfigurationValue } from 'vs/platform/configuration/common/configuration'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { Emitter } from 'vs/base/common/event'; export const workbenchConfigurationNodeBase = Object.freeze({ 'id': 'workbench', @@ -12,3 +18,88 @@ export const workbenchConfigurationNodeBase = Object.freeze( 'title': localize('workbenchConfigurationTitle', "Workbench"), 'type': 'object', }); + +export const Extensions = { + ConfigurationMigration: 'base.contributions.configuration.migration' +}; + +export type ConfigurationValue = { value: any | undefined /* Remove */ }; +export type ConfigurationKeyValuePairs = [string, ConfigurationValue][]; +export type ConfigurationMigrationFn = (value: any, valueAccessor: (key: string) => any) => ConfigurationValue | ConfigurationKeyValuePairs | Promise; +export type ConfigurationMigration = { key: string; migrateFn: ConfigurationMigrationFn }; + +export interface IConfigurationMigrationRegistry { + registerConfigurationMigrations(configurationMigrations: ConfigurationMigration[]): void; +} + +class ConfigurationMigrationRegistry implements IConfigurationMigrationRegistry { + + readonly migrations: ConfigurationMigration[] = []; + + private readonly _onDidRegisterConfigurationMigrations = new Emitter(); + readonly onDidRegisterConfigurationMigration = this._onDidRegisterConfigurationMigrations.event; + + registerConfigurationMigrations(configurationMigrations: ConfigurationMigration[]): void { + this.migrations.push(...configurationMigrations); + } + +} + +const configurationMigrationRegistry = new ConfigurationMigrationRegistry(); +Registry.add(Extensions.ConfigurationMigration, configurationMigrationRegistry); + +export class ConfigurationMigrationWorkbenchContribution extends Disposable implements IWorkbenchContribution { + + constructor( + @IConfigurationService private readonly configurationService: IConfigurationService, + @IWorkspaceContextService private readonly workspaceService: IWorkspaceContextService, + ) { + super(); + this._register(this.workspaceService.onDidChangeWorkspaceFolders(async (e) => { + for (const folder of e.added) { + await this.migrateConfigurationsForFolder(folder, configurationMigrationRegistry.migrations); + } + })); + this.migrateConfigurations(configurationMigrationRegistry.migrations); + this._register(configurationMigrationRegistry.onDidRegisterConfigurationMigration(migration => this.migrateConfigurations(migration))); + } + + private async migrateConfigurations(migrations: ConfigurationMigration[]): Promise { + await this.migrateConfigurationsForFolder(undefined, migrations); + for (const folder of this.workspaceService.getWorkspace().folders) { + await this.migrateConfigurationsForFolder(folder, migrations); + } + } + + private async migrateConfigurationsForFolder(folder: IWorkspaceFolder | undefined, migrations: ConfigurationMigration[]): Promise { + await Promise.all(migrations.map(migration => this.migrateConfigurationsForFolderAndOverride(migration, { resource: folder?.uri }))); + } + + private async migrateConfigurationsForFolderAndOverride(migration: ConfigurationMigration, overrides: IConfigurationOverrides): Promise { + const data = this.configurationService.inspect(migration.key, overrides); + + await this.migrateConfigurationForFolderOverrideAndTarget(migration, overrides, data, 'userValue', ConfigurationTarget.USER); + await this.migrateConfigurationForFolderOverrideAndTarget(migration, overrides, data, 'userLocalValue', ConfigurationTarget.USER_LOCAL); + await this.migrateConfigurationForFolderOverrideAndTarget(migration, overrides, data, 'userRemoteValue', ConfigurationTarget.USER_REMOTE); + await this.migrateConfigurationForFolderOverrideAndTarget(migration, overrides, data, 'workspaceFolderValue', ConfigurationTarget.WORKSPACE_FOLDER); + await this.migrateConfigurationForFolderOverrideAndTarget(migration, overrides, data, 'workspaceValue', ConfigurationTarget.WORKSPACE); + + if (typeof overrides.overrideIdentifier === 'undefined' && typeof data.overrideIdentifiers !== 'undefined') { + for (const overrideIdentifier of data.overrideIdentifiers) { + await this.migrateConfigurationsForFolderAndOverride(migration, { resource: overrides.resource, overrideIdentifier }); + } + } + } + + private async migrateConfigurationForFolderOverrideAndTarget(migration: ConfigurationMigration, overrides: IConfigurationOverrides, data: IConfigurationValue, dataKey: keyof IConfigurationValue, target: ConfigurationTarget): Promise { + const value = data[dataKey]; + if (typeof value === 'undefined') { + return; + } + + const valueAccessor = (key: string) => this.configurationService.inspect(key, overrides)[dataKey]; + const result = await migration.migrateFn(value, valueAccessor); + const keyValuePairs: ConfigurationKeyValuePairs = Array.isArray(result) ? result : [[migration.key, result]]; + await Promise.allSettled(keyValuePairs.map(async ([key, value]) => this.configurationService.updateValue(key, value.value, overrides, target))); + } +} diff --git a/src/vs/workbench/common/configurationMigration.ts b/src/vs/workbench/common/configurationMigration.ts deleted file mode 100644 index 44bcd77a4ad..00000000000 --- a/src/vs/workbench/common/configurationMigration.ts +++ /dev/null @@ -1,99 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; -import { Registry } from 'vs/platform/registry/common/platform'; -import { Extensions as WorkbenchExtensions, IWorkbenchContribution, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; -import { IWorkspaceContextService, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; -import { ConfigurationTarget, IConfigurationOverrides, IConfigurationService, IConfigurationValue } from 'vs/platform/configuration/common/configuration'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { Emitter } from 'vs/base/common/event'; - -export const Extensions = { - ConfigurationMigration: 'base.contributions.configuration.migration' -}; - -export type ConfigurationValue = { value: any | undefined /* Remove */ }; -export type ConfigurationKeyValuePairs = [string, ConfigurationValue][]; -export type ConfigurationMigrationFn = (value: any, valueAccessor: (key: string) => any) => ConfigurationValue | ConfigurationKeyValuePairs | Promise; -export type ConfigurationMigration = { key: string; migrateFn: ConfigurationMigrationFn }; - -export interface IConfigurationMigrationRegistry { - registerConfigurationMigrations(configurationMigrations: ConfigurationMigration[]): void; -} - -class ConfigurationMigrationRegistry implements IConfigurationMigrationRegistry { - - readonly migrations: ConfigurationMigration[] = []; - - private readonly _onDidRegisterConfigurationMigrations = new Emitter(); - readonly onDidRegisterConfigurationMigration = this._onDidRegisterConfigurationMigrations.event; - - registerConfigurationMigrations(configurationMigrations: ConfigurationMigration[]): void { - this.migrations.push(...configurationMigrations); - } - -} - -const configurationMigrationRegistry = new ConfigurationMigrationRegistry(); -Registry.add(Extensions.ConfigurationMigration, configurationMigrationRegistry); - -class ConfigurationMigrationWorkbenchContribution extends Disposable implements IWorkbenchContribution { - - constructor( - @IConfigurationService private readonly configurationService: IConfigurationService, - @IWorkspaceContextService private readonly workspaceService: IWorkspaceContextService, - ) { - super(); - this._register(this.workspaceService.onDidChangeWorkspaceFolders(async (e) => { - for (const folder of e.added) { - await this.migrateConfigurationsForFolder(folder, configurationMigrationRegistry.migrations); - } - })); - this.migrateConfigurations(configurationMigrationRegistry.migrations); - this._register(configurationMigrationRegistry.onDidRegisterConfigurationMigration(migration => this.migrateConfigurations(migration))); - } - - private async migrateConfigurations(migrations: ConfigurationMigration[]): Promise { - await this.migrateConfigurationsForFolder(undefined, migrations); - for (const folder of this.workspaceService.getWorkspace().folders) { - await this.migrateConfigurationsForFolder(folder, migrations); - } - } - - private async migrateConfigurationsForFolder(folder: IWorkspaceFolder | undefined, migrations: ConfigurationMigration[]): Promise { - await Promise.all(migrations.map(migration => this.migrateConfigurationsForFolderAndOverride(migration, { resource: folder?.uri }))); - } - - private async migrateConfigurationsForFolderAndOverride(migration: ConfigurationMigration, overrides: IConfigurationOverrides): Promise { - const data = this.configurationService.inspect(migration.key, overrides); - - await this.migrateConfigurationForFolderOverrideAndTarget(migration, overrides, data, 'userValue', ConfigurationTarget.USER); - await this.migrateConfigurationForFolderOverrideAndTarget(migration, overrides, data, 'userLocalValue', ConfigurationTarget.USER_LOCAL); - await this.migrateConfigurationForFolderOverrideAndTarget(migration, overrides, data, 'userRemoteValue', ConfigurationTarget.USER_REMOTE); - await this.migrateConfigurationForFolderOverrideAndTarget(migration, overrides, data, 'workspaceFolderValue', ConfigurationTarget.WORKSPACE_FOLDER); - await this.migrateConfigurationForFolderOverrideAndTarget(migration, overrides, data, 'workspaceValue', ConfigurationTarget.WORKSPACE); - - if (typeof overrides.overrideIdentifier === 'undefined' && typeof data.overrideIdentifiers !== 'undefined') { - for (const overrideIdentifier of data.overrideIdentifiers) { - await this.migrateConfigurationsForFolderAndOverride(migration, { resource: overrides.resource, overrideIdentifier }); - } - } - } - - private async migrateConfigurationForFolderOverrideAndTarget(migration: ConfigurationMigration, overrides: IConfigurationOverrides, data: IConfigurationValue, dataKey: keyof IConfigurationValue, target: ConfigurationTarget): Promise { - const value = data[dataKey]; - if (typeof value === 'undefined') { - return; - } - - const valueAccessor = (key: string) => this.configurationService.inspect(key, overrides)[dataKey]; - const result = await migration.migrateFn(value, valueAccessor); - const keyValuePairs: ConfigurationKeyValuePairs = Array.isArray(result) ? result : [[migration.key, result]]; - await Promise.allSettled(keyValuePairs.map(async ([key, value]) => this.configurationService.updateValue(key, value.value, overrides, target))); - } -} - -Registry.as(WorkbenchExtensions.Workbench).registerWorkbenchContribution(ConfigurationMigrationWorkbenchContribution, LifecyclePhase.Eventually); diff --git a/src/vs/workbench/contrib/codeEditor/browser/editorSettingsMigration.ts b/src/vs/workbench/contrib/codeEditor/browser/editorSettingsMigration.ts index 6a08839d154..6803bea8f1a 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/editorSettingsMigration.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/editorSettingsMigration.ts @@ -5,7 +5,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { EditorSettingMigration, ISettingsWriter } from 'vs/editor/browser/config/migrateOptions'; -import { ConfigurationKeyValuePairs, Extensions, IConfigurationMigrationRegistry } from 'vs/workbench/common/configurationMigration'; +import { ConfigurationKeyValuePairs, Extensions, IConfigurationMigrationRegistry } from 'vs/workbench/common/configuration'; Registry.as(Extensions.ConfigurationMigration) .registerConfigurationMigrations(EditorSettingMigration.items.map(item => ({ diff --git a/src/vs/workbench/contrib/search/browser/search.contribution.ts b/src/vs/workbench/contrib/search/browser/search.contribution.ts index b19a449124a..77782e09059 100644 --- a/src/vs/workbench/contrib/search/browser/search.contribution.ts +++ b/src/vs/workbench/contrib/search/browser/search.contribution.ts @@ -55,7 +55,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite'; import { ISearchConfiguration, SearchSortOrder, SEARCH_EXCLUDE_CONFIG, VIEWLET_ID, VIEW_ID } from 'vs/workbench/services/search/common/search'; -import { Extensions, IConfigurationMigrationRegistry } from 'vs/workbench/common/configurationMigration'; +import { Extensions, IConfigurationMigrationRegistry } from 'vs/workbench/common/configuration'; registerSingleton(ISearchWorkbenchService, SearchWorkbenchService, true); registerSingleton(ISearchHistoryService, SearchHistoryService, true);