@@ -13,6 +13,8 @@ import { Disposable } from 'vs/base/common/lifecycle';
13
13
import { Emitter } from 'vs/base/common/event' ;
14
14
import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService' ;
15
15
import { OperatingSystem , isWindows } from 'vs/base/common/platform' ;
16
+ import { URI } from 'vs/base/common/uri' ;
17
+ import { equals } from 'vs/base/common/objects' ;
16
18
17
19
export const applicationConfigurationNodeBase = Object . freeze < IConfigurationNode > ( {
18
20
'id' : 'application' ,
@@ -89,35 +91,56 @@ export class ConfigurationMigrationWorkbenchContribution extends Disposable impl
89
91
}
90
92
91
93
private async migrateConfigurationsForFolder ( folder : IWorkspaceFolder | undefined , migrations : ConfigurationMigration [ ] ) : Promise < void > {
92
- await Promise . all ( migrations . map ( migration => this . migrateConfigurationsForFolderAndOverride ( migration , { resource : folder ?. uri } ) ) ) ;
94
+ await Promise . all ( [ migrations . map ( migration => this . migrateConfigurationsForFolderAndOverride ( migration , folder ?. uri ) ) ] ) ;
93
95
}
94
96
95
- private async migrateConfigurationsForFolderAndOverride ( migration : ConfigurationMigration , overrides : IConfigurationOverrides ) : Promise < void > {
96
- const data = this . configurationService . inspect ( migration . key , overrides ) ;
97
+ private async migrateConfigurationsForFolderAndOverride ( migration : ConfigurationMigration , resource ?: URI ) : Promise < void > {
98
+ const inspectData = this . configurationService . inspect ( migration . key , { resource } ) ;
99
+
100
+ const targetPairs : [ keyof IConfigurationValue < any > , ConfigurationTarget ] [ ] = [
101
+ [ 'userValue' , ConfigurationTarget . USER ] ,
102
+ [ 'userLocalValue' , ConfigurationTarget . USER_LOCAL ] ,
103
+ [ 'userRemoteValue' , ConfigurationTarget . USER_REMOTE ] ,
104
+ [ 'workspaceValue' , ConfigurationTarget . WORKSPACE ] ,
105
+ [ 'workspaceFolderValue' , ConfigurationTarget . WORKSPACE_FOLDER ] ,
106
+ ] ;
107
+ for ( const [ dataKey , target ] of targetPairs ) {
108
+ const migrationValues : [ [ string , ConfigurationValue ] , string [ ] ] [ ] = [ ] ;
109
+
110
+ // Collect migrations for language overrides
111
+ for ( const overrideIdentifier of inspectData . overrideIdentifiers ?? [ ] ) {
112
+ const keyValuePairs = await this . runMigration ( migration , { resource, overrideIdentifier } , dataKey ) ;
113
+ for ( const keyValuePair of keyValuePairs ?? [ ] ) {
114
+ let keyValueAndOverridesPair = migrationValues . find ( ( [ [ k , v ] ] ) => k === keyValuePair [ 0 ] && equals ( v . value , keyValuePair [ 1 ] . value ) ) ;
115
+ if ( ! keyValueAndOverridesPair ) {
116
+ migrationValues . push ( keyValueAndOverridesPair = [ keyValuePair , [ ] ] ) ;
117
+ }
118
+ keyValueAndOverridesPair [ 1 ] . push ( overrideIdentifier ) ;
119
+ }
120
+ }
97
121
98
- await this . migrateConfigurationForFolderOverrideAndTarget ( migration , overrides , data , 'userValue' , ConfigurationTarget . USER ) ;
99
- await this . migrateConfigurationForFolderOverrideAndTarget ( migration , overrides , data , 'userLocalValue' , ConfigurationTarget . USER_LOCAL ) ;
100
- await this . migrateConfigurationForFolderOverrideAndTarget ( migration , overrides , data , 'userRemoteValue' , ConfigurationTarget . USER_REMOTE ) ;
101
- await this . migrateConfigurationForFolderOverrideAndTarget ( migration , overrides , data , 'workspaceFolderValue' , ConfigurationTarget . WORKSPACE_FOLDER ) ;
102
- await this . migrateConfigurationForFolderOverrideAndTarget ( migration , overrides , data , 'workspaceValue' , ConfigurationTarget . WORKSPACE ) ;
122
+ // Collect migrations
123
+ const keyValuePairs = await this . runMigration ( migration , { resource } , dataKey , inspectData ) ;
124
+ for ( const keyValuePair of keyValuePairs ?? [ ] ) {
125
+ migrationValues . push ( [ keyValuePair , [ ] ] ) ;
126
+ }
103
127
104
- if ( typeof overrides . overrideIdentifier === 'undefined' && typeof data . overrideIdentifiers !== 'undefined' ) {
105
- for ( const overrideIdentifier of data . overrideIdentifiers ) {
106
- await this . migrateConfigurationsForFolderAndOverride ( migration , { resource : overrides . resource , overrideIdentifier } ) ;
128
+ if ( migrationValues . length ) {
129
+ // apply migrations
130
+ await Promise . allSettled ( migrationValues . map ( async ( [ [ key , value ] , overrideIdentifiers ] ) =>
131
+ this . configurationService . updateValue ( key , value . value , { resource, overrideIdentifiers } , target ) ) ) ;
107
132
}
108
133
}
109
134
}
110
135
111
- private async migrateConfigurationForFolderOverrideAndTarget ( migration : ConfigurationMigration , overrides : IConfigurationOverrides , data : IConfigurationValue < any > , dataKey : keyof IConfigurationValue < any > , target : ConfigurationTarget ) : Promise < void > {
112
- const value = data [ dataKey ] ;
113
- if ( typeof value === ' undefined' ) {
114
- return ;
136
+ private async runMigration ( migration : ConfigurationMigration , overrides : IConfigurationOverrides , dataKey : keyof IConfigurationValue < any > , data ?: IConfigurationValue < any > ) : Promise < ConfigurationKeyValuePairs | undefined > {
137
+ const value = ( data ?? this . configurationService . inspect ( migration . key , overrides ) ) [ dataKey ] ;
138
+ if ( value === undefined ) {
139
+ return undefined ;
115
140
}
116
-
117
141
const valueAccessor = ( key : string ) => this . configurationService . inspect ( key , overrides ) [ dataKey ] ;
118
142
const result = await migration . migrateFn ( value , valueAccessor ) ;
119
- const keyValuePairs : ConfigurationKeyValuePairs = Array . isArray ( result ) ? result : [ [ migration . key , result ] ] ;
120
- await Promise . allSettled ( keyValuePairs . map ( async ( [ key , value ] ) => this . configurationService . updateValue ( key , value . value , overrides , target ) ) ) ;
143
+ return Array . isArray ( result ) ? result : [ [ migration . key , result ] ] ;
121
144
}
122
145
}
123
146
0 commit comments