Skip to content

Commit 0335a40

Browse files
committed
separate merge and apply
1 parent e26580b commit 0335a40

1 file changed

Lines changed: 34 additions & 9 deletions

File tree

src/vs/platform/userDataSync/common/userDataSyncService.ts

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)