44 *--------------------------------------------------------------------------------------------*/
55
66import { IFileService , FileOperationError , FileOperationResult } from 'vs/platform/files/common/files' ;
7- import { UserDataSyncError , UserDataSyncErrorCode , SyncStatus , IUserDataSyncStoreService , IUserDataSyncLogService , IUserDataSyncUtilService , SyncResource , IUserDataSynchroniser , IUserDataSyncEnablementService , IUserDataSyncBackupStoreService } from 'vs/platform/userDataSync/common/userDataSync' ;
7+ import { UserDataSyncError , UserDataSyncErrorCode , SyncStatus , IUserDataSyncStoreService , IUserDataSyncLogService , IUserDataSyncUtilService , SyncResource , IUserDataSynchroniser , IUserDataSyncEnablementService , IUserDataSyncBackupStoreService , USER_DATA_SYNC_SCHEME , PREVIEW_DIR_NAME } from 'vs/platform/userDataSync/common/userDataSync' ;
88import { merge } from 'vs/platform/userDataSync/common/keybindingsMerge' ;
99import { VSBuffer } from 'vs/base/common/buffer' ;
1010import { parse } from 'vs/base/common/json' ;
@@ -19,6 +19,7 @@ import { isNonEmptyArray } from 'vs/base/common/arrays';
1919import { IFileSyncPreviewResult , AbstractJsonFileSynchroniser , IRemoteUserData } from 'vs/platform/userDataSync/common/abstractSynchronizer' ;
2020import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry' ;
2121import { URI } from 'vs/base/common/uri' ;
22+ import { joinPath , isEqual } from 'vs/base/common/resources' ;
2223
2324interface ISyncContent {
2425 mac ?: string ;
@@ -29,8 +30,9 @@ interface ISyncContent {
2930
3031export class KeybindingsSynchroniser extends AbstractJsonFileSynchroniser implements IUserDataSynchroniser {
3132
32- protected get conflictsPreviewResource ( ) : URI { return this . environmentService . keybindingsSyncPreviewResource ; }
3333 protected readonly version : number = 1 ;
34+ protected readonly localPreviewResource : URI = joinPath ( this . syncFolder , PREVIEW_DIR_NAME , 'keybindings.json' ) ;
35+ protected readonly remotePreviewResource : URI = this . localPreviewResource . with ( { scheme : USER_DATA_SYNC_SCHEME } ) ;
3436
3537 constructor (
3638 @IUserDataSyncStoreService userDataSyncStoreService : IUserDataSyncStoreService ,
@@ -39,7 +41,7 @@ export class KeybindingsSynchroniser extends AbstractJsonFileSynchroniser implem
3941 @IConfigurationService configurationService : IConfigurationService ,
4042 @IUserDataSyncEnablementService userDataSyncEnablementService : IUserDataSyncEnablementService ,
4143 @IFileService fileService : IFileService ,
42- @IEnvironmentService private readonly environmentService : IEnvironmentService ,
44+ @IEnvironmentService environmentService : IEnvironmentService ,
4345 @IUserDataSyncUtilService userDataSyncUtilService : IUserDataSyncUtilService ,
4446 @ITelemetryService telemetryService : ITelemetryService ,
4547 ) {
@@ -129,8 +131,10 @@ export class KeybindingsSynchroniser extends AbstractJsonFileSynchroniser implem
129131
130132 }
131133
132- async accept ( content : string ) : Promise < void > {
133- if ( this . status === SyncStatus . HasConflicts ) {
134+ async acceptConflict ( conflict : URI , content : string ) : Promise < void > {
135+ if ( this . status === SyncStatus . HasConflicts
136+ && ( isEqual ( this . localPreviewResource , conflict ) || isEqual ( this . remotePreviewResource , conflict ) )
137+ ) {
134138 const preview = await this . syncPreviewResultPromise ! ;
135139 this . cancel ( ) ;
136140 this . syncPreviewResultPromise = createCancelablePromise ( async ( ) => ( { ...preview , content } ) ) ;
@@ -156,8 +160,8 @@ export class KeybindingsSynchroniser extends AbstractJsonFileSynchroniser implem
156160 return false ;
157161 }
158162
159- async getRemoteContentFromPreview ( ) : Promise < string | null > {
160- const content = await super . getRemoteContentFromPreview ( ) ;
163+ async getConflictContent ( conflictResource : URI ) : Promise < string | null > {
164+ const content = await super . getConflictContent ( conflictResource ) ;
161165 return content !== null ? this . getKeybindingsContentFromSyncContent ( content ) : null ;
162166 }
163167
@@ -224,7 +228,9 @@ export class KeybindingsSynchroniser extends AbstractJsonFileSynchroniser implem
224228
225229 if ( hasLocalChanged ) {
226230 this . logService . trace ( `${ this . syncResourceLogLabel } : Updating local keybindings...` ) ;
227- await this . backupLocal ( this . toSyncContent ( content , null ) ) ;
231+ if ( fileContent ) {
232+ await this . backupLocal ( this . toSyncContent ( fileContent . value . toString ( ) , null ) ) ;
233+ }
228234 await this . updateLocalFileContent ( content , fileContent ) ;
229235 this . logService . info ( `${ this . syncResourceLogLabel } : Updated local keybindings` ) ;
230236 }
@@ -238,7 +244,7 @@ export class KeybindingsSynchroniser extends AbstractJsonFileSynchroniser implem
238244
239245 // Delete the preview
240246 try {
241- await this . fileService . del ( this . conflictsPreviewResource ) ;
247+ await this . fileService . del ( this . localPreviewResource ) ;
242248 } catch ( e ) { /* ignore */ }
243249 } else {
244250 this . logService . info ( `${ this . syncResourceLogLabel } : No changes found during synchronizing keybindings.` ) ;
@@ -303,9 +309,11 @@ export class KeybindingsSynchroniser extends AbstractJsonFileSynchroniser implem
303309 }
304310
305311 if ( content && ! token . isCancellationRequested ) {
306- await this . fileService . writeFile ( this . environmentService . keybindingsSyncPreviewResource , VSBuffer . fromString ( content ) ) ;
312+ await this . fileService . writeFile ( this . localPreviewResource , VSBuffer . fromString ( content ) ) ;
307313 }
308314
315+ this . setConflicts ( hasConflicts && ! token . isCancellationRequested ? [ { local : this . localPreviewResource , remote : this . remotePreviewResource } ] : [ ] ) ;
316+
309317 return { fileContent, remoteUserData, lastSyncUserData, content, hasLocalChanged, hasRemoteChanged, hasConflicts } ;
310318 }
311319
0 commit comments