@@ -357,12 +357,25 @@ export abstract class AbstractSynchroniser extends Disposable implements IUserDa
357
357
358
358
protected async doSync ( remoteUserData : IRemoteUserData , lastSyncUserData : IRemoteUserData | null , apply : boolean , userDataSyncConfiguration : IUserDataSyncConfiguration ) : Promise < SyncStatus > {
359
359
try {
360
+
361
+ const isRemoteDataFromCurrentMachine = await this . isRemoteDataFromCurrentMachine ( remoteUserData ) ;
362
+ const acceptRemote = ! isRemoteDataFromCurrentMachine && lastSyncUserData === null && this . getStoredLastSyncUserDataStateContent ( ) !== undefined ;
363
+ const merge = apply && ! acceptRemote ;
364
+
360
365
// generate or use existing preview
361
366
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
+ }
363
377
}
364
378
365
- const preview = await this . syncPreviewPromise ;
366
379
this . updateConflicts ( preview . resourcePreviews ) ;
367
380
if ( preview . resourcePreviews . some ( ( { mergeState } ) => mergeState === MergeState . Conflict ) ) {
368
381
return SyncStatus . HasConflicts ;
@@ -532,8 +545,7 @@ export abstract class AbstractSynchroniser extends Disposable implements IUserDa
532
545
}
533
546
}
534
547
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 > {
537
549
const resourcePreviewResults = await this . generateSyncPreview ( remoteUserData , lastSyncUserData , isRemoteDataFromCurrentMachine , userDataSyncConfiguration , token ) ;
538
550
539
551
const resourcePreviews : IEditableResourcePreview [ ] = [ ] ;
@@ -553,7 +565,7 @@ export abstract class AbstractSynchroniser extends Disposable implements IUserDa
553
565
/* Changed -> Apply ? (Merge ? Conflict | Accept) : Preview */
554
566
else {
555
567
/* Merge */
556
- const mergeResult = apply ? await this . getMergeResult ( resourcePreviewResult , token ) : undefined ;
568
+ const mergeResult = merge ? await this . getMergeResult ( resourcePreviewResult , token ) : undefined ;
557
569
if ( token . isCancellationRequested ) {
558
570
break ;
559
571
}
@@ -579,7 +591,7 @@ export abstract class AbstractSynchroniser extends Disposable implements IUserDa
579
591
}
580
592
581
593
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 ( ) ;
583
595
if ( ! storedLastSyncUserDataStateContent ) {
584
596
storedLastSyncUserDataStateContent = await this . migrateLastSyncUserData ( ) ;
585
597
}
@@ -635,7 +647,7 @@ export abstract class AbstractSynchroniser extends Disposable implements IUserDa
635
647
await this . writeLastSyncStoredRemoteUserData ( { ref : lastSyncUserDataState . ref , syncData } ) ;
636
648
} catch ( error ) {
637
649
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 .` ) ;
639
651
} else {
640
652
throw error ;
641
653
}
@@ -669,6 +681,10 @@ export abstract class AbstractSynchroniser extends Disposable implements IUserDa
669
681
await this . writeLastSyncStoredRemoteUserData ( lastSyncRemoteUserData ) ;
670
682
}
671
683
684
+ private getStoredLastSyncUserDataStateContent ( ) : string | undefined {
685
+ return this . storageService . get ( this . lastSyncUserDataStateKey , StorageScope . APPLICATION ) ;
686
+ }
687
+
672
688
private async readLastSyncStoredRemoteUserData ( ) : Promise < IRemoteUserData | undefined > {
673
689
const content = ( await this . fileService . readFile ( this . lastSyncResource ) ) . value . toString ( ) ;
674
690
try {
0 commit comments