@@ -57,8 +57,8 @@ export interface IMergableResourcePreview extends IBaseResourcePreview {
5757 readonly remoteContent : string | null ;
5858 readonly localContent : string | null ;
5959 readonly previewContent : string | null ;
60+ readonly acceptedContent : string | null ;
6061 readonly hasConflicts : boolean ;
61- mergeState : MergeState ;
6262}
6363
6464export type IResourcePreview = Omit < IMergableResourcePreview , 'mergeState' > ;
@@ -385,48 +385,58 @@ export abstract class AbstractSynchroniser extends Disposable {
385385 }
386386
387387 async accept ( resource : URI , content : string ) : Promise < ISyncResourcePreview | null > {
388- if ( ! this . syncPreviewPromise ) {
389- return null ;
390- }
391-
392- let preview = await this . syncPreviewPromise ;
393- this . syncPreviewPromise = createCancelablePromise ( token => this . updateSyncResourcePreviewContent ( preview , resource , content , token ) ) ;
394-
395- preview = await this . syncPreviewPromise ;
396- this . updateConflicts ( preview . resourcePreviews ) ;
397- if ( preview . resourcePreviews . some ( ( { mergeState } ) => mergeState === MergeState . Conflict ) ) {
398- this . setStatus ( SyncStatus . HasConflicts ) ;
399- } else {
400- this . setStatus ( SyncStatus . Syncing ) ;
401- }
402-
403- return preview ;
388+ await this . updateSyncResourcePreview ( resource , async ( resourcePreview ) => {
389+ const updatedResourcePreview = await this . updateResourcePreview ( resourcePreview , resource , content ) ;
390+ return {
391+ ...updatedResourcePreview ,
392+ mergeState : MergeState . Accepted
393+ } ;
394+ } ) ;
395+ return this . syncPreviewPromise ;
404396 }
405397
406398 async merge ( resource : URI ) : Promise < ISyncResourcePreview | null > {
407- await this . changeMergeState ( resource , ( resourcePreview ) => resourcePreview . hasConflicts ? MergeState . Conflict : MergeState . Accepted ) ;
399+ await this . updateSyncResourcePreview ( resource , async ( resourcePreview ) => ( {
400+ ...resourcePreview ,
401+ mergeState : resourcePreview . hasConflicts ? MergeState . Conflict : MergeState . Accepted
402+ } ) ) ;
408403 return this . syncPreviewPromise ;
409404 }
410405
411406 async discard ( resource : URI ) : Promise < ISyncResourcePreview | null > {
412- await this . changeMergeState ( resource , ( ) => MergeState . Preview ) ;
407+ await this . updateSyncResourcePreview ( resource , async ( resourcePreview ) => {
408+ await this . fileService . writeFile ( resourcePreview . previewResource , VSBuffer . fromString ( resourcePreview . previewContent || '' ) ) ;
409+ const updatedPreview = await this . updateResourcePreview ( resourcePreview , resourcePreview . previewResource , resourcePreview . previewContent || '' ) ;
410+ return {
411+ ...updatedPreview ,
412+ mergeState : MergeState . Preview
413+ } ;
414+ } ) ;
413415 return this . syncPreviewPromise ;
414416 }
415417
416- private async changeMergeState ( resource : URI , mergeState : ( resourcePreview : IMergableResourcePreview ) => MergeState ) : Promise < void > {
418+ private async updateSyncResourcePreview ( resource : URI , updateResourcePreview : ( resourcePreview : IMergableResourcePreview ) => Promise < IMergableResourcePreview > ) : Promise < void > {
417419 if ( ! this . syncPreviewPromise ) {
418420 return ;
419421 }
420422
421- const preview = await this . syncPreviewPromise ;
422- const resourcePreview = preview . resourcePreviews . find ( ( { localResource, remoteResource, previewResource } ) =>
423+ let preview = await this . syncPreviewPromise ;
424+ const index = preview . resourcePreviews . findIndex ( ( { localResource, remoteResource, previewResource } ) =>
423425 isEqual ( localResource , resource ) || isEqual ( remoteResource , resource ) || isEqual ( previewResource , resource ) ) ;
424- if ( ! resourcePreview ) {
426+ if ( index === - 1 ) {
425427 return ;
426428 }
427429
428- resourcePreview . mergeState = mergeState ( resourcePreview ) ;
430+ this . syncPreviewPromise = createCancelablePromise ( async token => {
431+ const resourcePreviews = [ ...preview . resourcePreviews ] ;
432+ resourcePreviews [ index ] = await updateResourcePreview ( resourcePreviews [ index ] ) ;
433+ return {
434+ ...preview ,
435+ resourcePreviews
436+ } ;
437+ } ) ;
429438
439+ preview = await this . syncPreviewPromise ;
430440 this . updateConflicts ( preview . resourcePreviews ) ;
431441 if ( preview . resourcePreviews . some ( ( { mergeState } ) => mergeState === MergeState . Conflict ) ) {
432442 this . setStatus ( SyncStatus . HasConflicts ) ;
@@ -435,6 +445,13 @@ export abstract class AbstractSynchroniser extends Disposable {
435445 }
436446 }
437447
448+ protected async updateResourcePreview ( resourcePreview : IResourcePreview , resource : URI , acceptedContent : string ) : Promise < IResourcePreview > {
449+ return {
450+ ...resourcePreview ,
451+ acceptedContent
452+ } ;
453+ }
454+
438455 private async doApply ( force : boolean ) : Promise < SyncStatus > {
439456 if ( ! this . syncPreviewPromise ) {
440457 return SyncStatus . Idle ;
@@ -464,32 +481,6 @@ export abstract class AbstractSynchroniser extends Disposable {
464481 return SyncStatus . Idle ;
465482 }
466483
467- private async updateSyncResourcePreviewContent ( preview : ISyncResourcePreview , resource : URI , previewContent : string , token : CancellationToken ) : Promise < ISyncResourcePreview > {
468- const index = preview . resourcePreviews . findIndex ( ( { localResource, remoteResource, previewResource, localChange, remoteChange } ) =>
469- ( localChange !== Change . None || remoteChange !== Change . None )
470- && ( isEqual ( localResource , resource ) || isEqual ( remoteResource , resource ) || isEqual ( previewResource , resource ) ) ) ;
471- if ( index !== - 1 ) {
472- const resourcePreviews = [ ...preview . resourcePreviews ] ;
473- const resourcePreview = await this . updateResourcePreviewContent ( resourcePreviews [ index ] , resource , previewContent , token ) ;
474- resourcePreviews [ index ] = { ...resourcePreview , mergeState : MergeState . Accepted } ;
475- preview = {
476- ...preview ,
477- resourcePreviews
478- } ;
479- }
480- return preview ;
481- }
482-
483- protected async updateResourcePreviewContent ( resourcePreview : IResourcePreview , resource : URI , previewContent : string , token : CancellationToken ) : Promise < IResourcePreview > {
484- return {
485- ...resourcePreview ,
486- previewContent,
487- hasConflicts : false ,
488- localChange : Change . Modified ,
489- remoteChange : Change . Modified ,
490- } ;
491- }
492-
493484 private async clearPreviewFolder ( ) : Promise < void > {
494485 try {
495486 await this . fileService . del ( this . syncPreviewFolder , { recursive : true } ) ;
@@ -555,13 +546,13 @@ export abstract class AbstractSynchroniser extends Disposable {
555546 const syncPreview = this . syncPreviewPromise ? await this . syncPreviewPromise : null ;
556547 if ( syncPreview ) {
557548 for ( const resourcePreview of syncPreview . resourcePreviews ) {
558- if ( resourcePreview . previewResource && isEqual ( resourcePreview . previewResource , uri ) ) {
559- return resourcePreview . previewContent || '' ;
549+ if ( isEqual ( resourcePreview . acceptedResource , uri ) ) {
550+ return resourcePreview . acceptedContent || '' ;
560551 }
561- if ( resourcePreview . remoteResource && isEqual ( resourcePreview . remoteResource , uri ) ) {
552+ if ( isEqual ( resourcePreview . remoteResource , uri ) ) {
562553 return resourcePreview . remoteContent || '' ;
563554 }
564- if ( resourcePreview . localResource && isEqual ( resourcePreview . localResource , uri ) ) {
555+ if ( isEqual ( resourcePreview . localResource , uri ) ) {
565556 return resourcePreview . localContent || '' ;
566557 }
567558 }
@@ -581,18 +572,25 @@ export abstract class AbstractSynchroniser extends Disposable {
581572
582573 // For preview, use remoteUserData if lastSyncUserData does not exists and last sync is from current machine
583574 const lastSyncUserDataForPreview = lastSyncUserData === null && isLastSyncFromCurrentMachine ? remoteUserData : lastSyncUserData ;
584- const resourcePreviews = await this . generateSyncPreview ( remoteUserData , lastSyncUserDataForPreview , token ) ;
585-
586- // Mark merge
587- const mergableResourcePreviews = resourcePreviews . map < IMergableResourcePreview > ( r => ( {
588- ...r ,
589- mergeState : r . localChange === Change . None && r . remoteChange === Change . None ? MergeState . Accepted /* Mark previews with no changes as merged */
590- : apply ? ( r . hasConflicts ? MergeState . Conflict : MergeState . Accepted )
591- : MergeState . Preview
575+ const result = await this . generateSyncPreview ( remoteUserData , lastSyncUserDataForPreview , token ) ;
592576
593- } ) ) ;
577+ const resourcePreviews : IMergableResourcePreview [ ] = [ ] ;
578+ for ( const resourcePreview of result ) {
579+ if ( token . isCancellationRequested ) {
580+ break ;
581+ }
582+ if ( ! apply ) {
583+ await this . fileService . writeFile ( resourcePreview . previewResource , VSBuffer . fromString ( resourcePreview . previewContent || '' ) ) ;
584+ }
585+ resourcePreviews . push ( {
586+ ...resourcePreview ,
587+ mergeState : resourcePreview . localChange === Change . None && resourcePreview . remoteChange === Change . None ? MergeState . Accepted /* Mark previews with no changes as merged */
588+ : apply ? ( resourcePreview . hasConflicts ? MergeState . Conflict : MergeState . Accepted )
589+ : MergeState . Preview
590+ } ) ;
591+ }
594592
595- return { remoteUserData, lastSyncUserData, resourcePreviews : mergableResourcePreviews , isLastSyncFromCurrentMachine } ;
593+ return { remoteUserData, lastSyncUserData, resourcePreviews, isLastSyncFromCurrentMachine } ;
596594 }
597595
598596 async getLastSyncUserData < T extends IRemoteUserData > ( ) : Promise < T | null > {
0 commit comments