@@ -453,7 +453,7 @@ class ManualSyncTask extends Disposable implements IManualSyncTask {
453453 if ( resource ) {
454454 return this . performAction ( resource , sychronizer => sychronizer . merge ( resource ) ) ;
455455 } else {
456- return this . doMerge ( false ) ;
456+ return this . mergeAll ( ) ;
457457 }
458458 }
459459
@@ -485,7 +485,37 @@ class ManualSyncTask extends Disposable implements IManualSyncTask {
485485 }
486486
487487 async apply ( ) : Promise < [ SyncResource , ISyncResourcePreview ] [ ] > {
488- return this . doMerge ( true ) ;
488+ if ( ! this . previews ) {
489+ throw new Error ( 'You need to create preview before applying' ) ;
490+ }
491+ if ( this . synchronizingResources . length ) {
492+ throw new Error ( 'Cannot pull while synchronizing resources' ) ;
493+ }
494+ const previews : [ SyncResource , ISyncResourcePreview ] [ ] = [ ] ;
495+ for ( const [ syncResource , preview ] of this . previews ) {
496+ this . synchronizingResources . push ( [ syncResource , preview . resourcePreviews . map ( r => r . localResource ) ] ) ;
497+ this . _onSynchronizeResources . fire ( this . synchronizingResources ) ;
498+
499+ const synchroniser = this . synchronisers . find ( s => s . resource === syncResource ) ! ;
500+
501+ /* merge those which are not yet merged */
502+ for ( const resourcePreview of preview . resourcePreviews ) {
503+ if ( ( resourcePreview . localChange !== Change . None || resourcePreview . remoteChange !== Change . None ) && resourcePreview . mergeState === MergeState . Preview ) {
504+ await synchroniser . merge ( resourcePreview . previewResource ) ;
505+ }
506+ }
507+
508+ /* apply */
509+ const newPreview = await synchroniser . apply ( false , this . syncHeaders ) ;
510+ if ( newPreview ) {
511+ previews . push ( this . toSyncResourcePreview ( synchroniser . resource , newPreview ) ) ;
512+ }
513+
514+ this . synchronizingResources . splice ( this . synchronizingResources . findIndex ( s => s [ 0 ] === syncResource ) , 1 ) ;
515+ this . _onSynchronizeResources . fire ( this . synchronizingResources ) ;
516+ }
517+ this . previews = previews ;
518+ return this . previews ;
489519 }
490520
491521 async pull ( ) : Promise < void > {
@@ -584,7 +614,7 @@ class ManualSyncTask extends Disposable implements IManualSyncTask {
584614 return this . previews ;
585615 }
586616
587- private async doMerge ( apply : boolean ) : Promise < [ SyncResource , ISyncResourcePreview ] [ ] > {
617+ private async mergeAll ( ) : Promise < [ SyncResource , ISyncResourcePreview ] [ ] > {
588618 if ( ! this . previews ) {
589619 throw new Error ( 'You need to create preview before merging or applying' ) ;
590620 }
@@ -599,18 +629,13 @@ class ManualSyncTask extends Disposable implements IManualSyncTask {
599629 const synchroniser = this . synchronisers . find ( s => s . resource === syncResource ) ! ;
600630
601631 /* merge those which are not yet merged */
602- let newPreview : ISyncResourcePreview | null = null ;
632+ let newPreview : ISyncResourcePreview | null = preview ;
603633 for ( const resourcePreview of preview . resourcePreviews ) {
604634 if ( ( resourcePreview . localChange !== Change . None || resourcePreview . remoteChange !== Change . None ) && resourcePreview . mergeState === MergeState . Preview ) {
605635 newPreview = await synchroniser . merge ( resourcePreview . previewResource ) ;
606636 }
607637 }
608638
609- /* apply */
610- if ( apply ) {
611- newPreview = await synchroniser . apply ( false , this . syncHeaders ) ;
612- }
613-
614639 if ( newPreview ) {
615640 previews . push ( this . toSyncResourcePreview ( synchroniser . resource , newPreview ) ) ;
616641 }
0 commit comments