@@ -357,12 +357,25 @@ export abstract class AbstractSynchroniser extends Disposable implements IUserDa
357357
358358 protected async doSync ( remoteUserData : IRemoteUserData , lastSyncUserData : IRemoteUserData | null , apply : boolean , userDataSyncConfiguration : IUserDataSyncConfiguration ) : Promise < SyncStatus > {
359359 try {
360+
361+ const isRemoteDataFromCurrentMachine = await this . isRemoteDataFromCurrentMachine ( remoteUserData ) ;
362+ const acceptRemote = ! isRemoteDataFromCurrentMachine && lastSyncUserData === null && this . getStoredLastSyncUserDataStateContent ( ) !== undefined ;
363+ const merge = apply && ! acceptRemote ;
364+
360365 // generate or use existing preview
361366 if ( ! this . syncPreviewPromise ) {
362- this . syncPreviewPromise = createCancelablePromise ( token => this . doGenerateSyncResourcePreview ( remoteUserData , lastSyncUserData , apply , userDataSyncConfiguration , token ) ) ;
367+ this . syncPreviewPromise = createCancelablePromise ( token => this . doGenerateSyncResourcePreview ( remoteUserData , lastSyncUserData , isRemoteDataFromCurrentMachine , merge , userDataSyncConfiguration , token ) ) ;
368+ }
369+
370+ let preview = await this . syncPreviewPromise ;
371+
372+ if ( apply && acceptRemote ) {
373+ this . logService . info ( `${ this . syncResourceLogLabel } : Accepting remote because it was synced before and the last sync data is not available.` ) ;
374+ for ( const resourcePreview of preview . resourcePreviews ) {
375+ preview = ( await this . accept ( resourcePreview . remoteResource ) ) || preview ;
376+ }
363377 }
364378
365- const preview = await this . syncPreviewPromise ;
366379 this . updateConflicts ( preview . resourcePreviews ) ;
367380 if ( preview . resourcePreviews . some ( ( { mergeState } ) => mergeState === MergeState . Conflict ) ) {
368381 return SyncStatus . HasConflicts ;
@@ -532,8 +545,7 @@ export abstract class AbstractSynchroniser extends Disposable implements IUserDa
532545 }
533546 }
534547
535- private async doGenerateSyncResourcePreview ( remoteUserData : IRemoteUserData , lastSyncUserData : IRemoteUserData | null , apply : boolean , userDataSyncConfiguration : IUserDataSyncConfiguration , token : CancellationToken ) : Promise < ISyncResourcePreview > {
536- const isRemoteDataFromCurrentMachine = await this . isRemoteDataFromCurrentMachine ( remoteUserData ) ;
548+ private async doGenerateSyncResourcePreview ( remoteUserData : IRemoteUserData , lastSyncUserData : IRemoteUserData | null , isRemoteDataFromCurrentMachine : boolean , merge : boolean , userDataSyncConfiguration : IUserDataSyncConfiguration , token : CancellationToken ) : Promise < ISyncResourcePreview > {
537549 const resourcePreviewResults = await this . generateSyncPreview ( remoteUserData , lastSyncUserData , isRemoteDataFromCurrentMachine , userDataSyncConfiguration , token ) ;
538550
539551 const resourcePreviews : IEditableResourcePreview [ ] = [ ] ;
@@ -553,7 +565,7 @@ export abstract class AbstractSynchroniser extends Disposable implements IUserDa
553565 /* Changed -> Apply ? (Merge ? Conflict | Accept) : Preview */
554566 else {
555567 /* Merge */
556- const mergeResult = apply ? await this . getMergeResult ( resourcePreviewResult , token ) : undefined ;
568+ const mergeResult = merge ? await this . getMergeResult ( resourcePreviewResult , token ) : undefined ;
557569 if ( token . isCancellationRequested ) {
558570 break ;
559571 }
@@ -579,7 +591,7 @@ export abstract class AbstractSynchroniser extends Disposable implements IUserDa
579591 }
580592
581593 async getLastSyncUserData < T = IRemoteUserData & { [ key : string ] : any } > ( ) : Promise < T | null > {
582- let storedLastSyncUserDataStateContent = this . storageService . get ( this . lastSyncUserDataStateKey , StorageScope . APPLICATION ) ;
594+ let storedLastSyncUserDataStateContent = this . getStoredLastSyncUserDataStateContent ( ) ;
583595 if ( ! storedLastSyncUserDataStateContent ) {
584596 storedLastSyncUserDataStateContent = await this . migrateLastSyncUserData ( ) ;
585597 }
@@ -635,7 +647,7 @@ export abstract class AbstractSynchroniser extends Disposable implements IUserDa
635647 await this . writeLastSyncStoredRemoteUserData ( { ref : lastSyncUserDataState . ref , syncData } ) ;
636648 } catch ( error ) {
637649 if ( error instanceof UserDataSyncError && error . code === UserDataSyncErrorCode . NotFound ) {
638- this . logService . info ( `${ this . syncResourceLogLabel } : .` ) ;
650+ this . logService . info ( `${ this . syncResourceLogLabel } : Last sync resource does not exist remotely .` ) ;
639651 } else {
640652 throw error ;
641653 }
@@ -669,6 +681,10 @@ export abstract class AbstractSynchroniser extends Disposable implements IUserDa
669681 await this . writeLastSyncStoredRemoteUserData ( lastSyncRemoteUserData ) ;
670682 }
671683
684+ private getStoredLastSyncUserDataStateContent ( ) : string | undefined {
685+ return this . storageService . get ( this . lastSyncUserDataStateKey , StorageScope . APPLICATION ) ;
686+ }
687+
672688 private async readLastSyncStoredRemoteUserData ( ) : Promise < IRemoteUserData | undefined > {
673689 const content = ( await this . fileService . readFile ( this . lastSyncResource ) ) . value . toString ( ) ;
674690 try {
0 commit comments