@@ -11,7 +11,6 @@ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storag
1111import { IRemoteUserDataService , IUserData , RemoteUserDataError , RemoteUserDataErrorCode , ISynchroniser , SyncStatus , SETTINGS_PREVIEW_RESOURCE } from 'vs/workbench/services/userData/common/userData' ;
1212import { VSBuffer } from 'vs/base/common/buffer' ;
1313import { parse , findNodeAtLocation , parseTree , ParseError } from 'vs/base/common/json' ;
14- import { URI } from 'vs/base/common/uri' ;
1514import { ITextModel } from 'vs/editor/common/model' ;
1615import { IModelService } from 'vs/editor/common/services/modelService' ;
1716import { IModeService } from 'vs/editor/common/services/modeService' ;
@@ -25,7 +24,6 @@ import { Emitter, Event } from 'vs/base/common/event';
2524import { ILogService } from 'vs/platform/log/common/log' ;
2625import { Position } from 'vs/editor/common/core/position' ;
2726import { IHistoryService } from 'vs/workbench/services/history/common/history' ;
28- import { isEqual } from 'vs/base/common/resources' ;
2927import { CancelablePromise , createCancelablePromise } from 'vs/base/common/async' ;
3028
3129interface ISyncPreviewResult {
@@ -83,7 +81,7 @@ export class SettingsSynchroniser extends Disposable implements ISynchroniser {
8381 this . setStatus ( SyncStatus . HasConflicts ) ;
8482 return false ;
8583 }
86- await this . apply ( SETTINGS_PREVIEW_RESOURCE ) ;
84+ await this . apply ( ) ;
8785 return true ;
8886 } catch ( e ) {
8987 this . syncPreviewResultPromise = null ;
@@ -129,35 +127,40 @@ export class SettingsSynchroniser extends Disposable implements ISynchroniser {
129127 return true ;
130128 }
131129
132- async apply ( previewResource : URI ) : Promise < boolean > {
133- if ( ! isEqual ( previewResource , SETTINGS_PREVIEW_RESOURCE , false ) ) {
130+ async continueSync ( ) : Promise < boolean > {
131+ if ( this . status !== SyncStatus . HasConflicts ) {
134132 return false ;
135133 }
136- if ( this . syncPreviewResultPromise ) {
137- const result = await this . syncPreviewResultPromise ;
138- let remoteUserData = result . remoteUserData ;
139- const settingsPreivew = await this . fileService . readFile ( SETTINGS_PREVIEW_RESOURCE ) ;
140- const content = settingsPreivew . value . toString ( ) ;
141-
142- const parseErrors : ParseError [ ] = [ ] ;
143- parse ( content , parseErrors ) ;
144- if ( parseErrors . length > 0 ) {
145- return Promise . reject ( localize ( 'errorInvalidSettings' , "Unable to sync settings. Please fix errors/warnings in it and try again." ) ) ;
146- }
147- if ( result . hasRemoteChanged ) {
148- const ref = await this . writeToRemote ( content , remoteUserData ? remoteUserData . ref : null ) ;
149- remoteUserData = { ref, content } ;
150- }
151- if ( result . hasLocalChanged ) {
152- await this . writeToLocal ( content , result . fileContent ) ;
153- }
154- if ( remoteUserData ) {
155- this . updateLastSyncValue ( remoteUserData ) ;
156- }
134+ await this . apply ( ) ;
135+ return true ;
136+ }
137+
138+ private async apply ( ) : Promise < void > {
139+ if ( ! this . syncPreviewResultPromise ) {
140+ return ;
141+ }
142+ const result = await this . syncPreviewResultPromise ;
143+ let remoteUserData = result . remoteUserData ;
144+ const settingsPreivew = await this . fileService . readFile ( SETTINGS_PREVIEW_RESOURCE ) ;
145+ const content = settingsPreivew . value . toString ( ) ;
146+
147+ const parseErrors : ParseError [ ] = [ ] ;
148+ parse ( content , parseErrors ) ;
149+ if ( parseErrors . length > 0 ) {
150+ return Promise . reject ( localize ( 'errorInvalidSettings' , "Unable to sync settings. Please resolve conflicts without any errors/warnings and try again." ) ) ;
151+ }
152+ if ( result . hasRemoteChanged ) {
153+ const ref = await this . writeToRemote ( content , remoteUserData ? remoteUserData . ref : null ) ;
154+ remoteUserData = { ref, content } ;
155+ }
156+ if ( result . hasLocalChanged ) {
157+ await this . writeToLocal ( content , result . fileContent ) ;
158+ }
159+ if ( remoteUserData ) {
160+ this . updateLastSyncValue ( remoteUserData ) ;
157161 }
158162 this . syncPreviewResultPromise = null ;
159163 this . setStatus ( SyncStatus . Idle ) ;
160- return true ;
161164 }
162165
163166 private getPreview ( ) : Promise < ISyncPreviewResult > {
@@ -225,8 +228,8 @@ export class SettingsSynchroniser extends Disposable implements ISynchroniser {
225228 // Remote has moved forward
226229 if ( remoteUserData . ref !== lastSyncData . ref ) {
227230 this . logService . trace ( 'Settings Sync: Remote contents have changed. Merge and Sync.' ) ;
228- hasRemoteChanged = true ;
229- hasLocalChanged = lastSyncData . content !== localContent ;
231+ hasLocalChanged = true ;
232+ hasRemoteChanged = lastSyncData . content !== localContent ;
230233 const mergeResult = await this . mergeContents ( localContent , remoteContent , lastSyncData . content ) ;
231234 return { settingsPreview : mergeResult . settingsPreview , hasLocalChanged, hasRemoteChanged, hasConflicts : mergeResult . hasConflicts } ;
232235 }
@@ -278,8 +281,8 @@ export class SettingsSynchroniser extends Disposable implements ISynchroniser {
278281 const base = lastSyncedContent ? parse ( lastSyncedContent ) : null ;
279282 const settingsPreviewModel = this . modelService . createModel ( localContent , this . modeService . create ( 'jsonc' ) ) ;
280283
281- const baseToLocal = base ? this . compare ( base , local ) : { added : new Set < string > ( ) , removed : new Set < string > ( ) , updated : new Set < string > ( ) } ;
282- const baseToRemote = base ? this . compare ( base , remote ) : { added : new Set < string > ( ) , removed : new Set < string > ( ) , updated : new Set < string > ( ) } ;
284+ const baseToLocal = base ? this . compare ( base , local ) : { added : Object . keys ( local ) . reduce ( ( r , k ) => { r . add ( k ) ; return r ; } , new Set < string > ( ) ) , removed : new Set < string > ( ) , updated : new Set < string > ( ) } ;
285+ const baseToRemote = base ? this . compare ( base , remote ) : { added : Object . keys ( remote ) . reduce ( ( r , k ) => { r . add ( k ) ; return r ; } , new Set < string > ( ) ) , removed : new Set < string > ( ) , updated : new Set < string > ( ) } ;
283286 const localToRemote = this . compare ( local , remote ) ;
284287
285288 const conflicts : Set < string > = new Set < string > ( ) ;
0 commit comments