diff --git a/src/vs/workbench/contrib/userDataSync/browser/userDataManualSyncView.ts b/src/vs/workbench/contrib/userDataSync/browser/userDataManualSyncView.ts index c051cd3c386..8c17cfd3d74 100644 --- a/src/vs/workbench/contrib/userDataSync/browser/userDataManualSyncView.ts +++ b/src/vs/workbench/contrib/userDataSync/browser/userDataManualSyncView.ts @@ -282,10 +282,16 @@ export class UserDataManualSyncViewPane extends TreeViewPane { } private async apply(): Promise { + this.closeAll(); this.syncButton.label = localize('turning on', "Turning on..."); this.syncButton.enabled = false; this.cancelButton.enabled = false; - return this.withProgress(async () => this.userDataSyncPreview.apply()); + try { + await this.withProgress(async () => this.userDataSyncPreview.apply()); + } catch (error) { + this.syncButton.enabled = false; + this.cancelButton.enabled = true; + } } private async cancel(): Promise { @@ -331,7 +337,7 @@ export class UserDataManualSyncViewPane extends TreeViewPane { } } - private close(previewResource: IUserDataSyncResource) { + private close(previewResource: IUserDataSyncResource): void { for (const input of this.editorService.editors) { if (input instanceof DiffEditorInput) { // Close all diff editors @@ -360,6 +366,12 @@ export class UserDataManualSyncViewPane extends TreeViewPane { } } + private closeAll() { + for (const previewResource of this.userDataSyncPreview.resources) { + this.close(previewResource); + } + } + private withProgress(task: () => Promise): Promise { return this.progressService.withProgress({ location: MANUAL_SYNC_VIEW_ID, delay: 500 }, task); } diff --git a/src/vs/workbench/services/userDataSync/browser/userDataSyncWorkbenchService.ts b/src/vs/workbench/services/userDataSync/browser/userDataSyncWorkbenchService.ts index 680e3a2af33..6d6701ebb64 100644 --- a/src/vs/workbench/services/userDataSync/browser/userDataSyncWorkbenchService.ts +++ b/src/vs/workbench/services/userDataSync/browser/userDataSyncWorkbenchService.ts @@ -337,7 +337,7 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat await this.waitForActiveSyncViews(); await this.viewsService.openView(MANUAL_SYNC_VIEW_ID); - const completed = await Event.toPromise(this.userDataSyncPreview.onDidCompleteManualSync); + const error = await Event.toPromise(this.userDataSyncPreview.onDidCompleteManualSync); this.userDataSyncPreview.unsetManualSyncPreview(); this.manualSyncViewEnablementContext.set(false); @@ -348,8 +348,8 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat this.viewsService.closeViewContainer(viewContainer!.id); } - if (!completed) { - throw canceled(); + if (error) { + throw error; } } @@ -567,7 +567,7 @@ class UserDataSyncPreview extends Disposable implements IUserDataSyncPreview { private _onDidChangeConflicts = this._register(new Emitter>()); readonly onDidChangeConflicts = this._onDidChangeConflicts.event; - private _onDidCompleteManualSync = this._register(new Emitter()); + private _onDidCompleteManualSync = this._register(new Emitter()); readonly onDidCompleteManualSync = this._onDidCompleteManualSync.event; private manualSync: { preview: [SyncResource, ISyncResourcePreview][], task: IManualSyncTask, disposables: DisposableStore } | undefined; @@ -623,10 +623,16 @@ class UserDataSyncPreview extends Disposable implements IUserDataSyncPreview { throw new Error('Can apply only while syncing manually'); } - const syncPreview = await this.manualSync.task.apply(); - this.updatePreview(syncPreview); - if (!this._resources.length) { - this._onDidCompleteManualSync.fire(true); + try { + const syncPreview = await this.manualSync.task.apply(); + this.updatePreview(syncPreview); + if (!this._resources.length) { + this._onDidCompleteManualSync.fire(undefined); + } + } catch (error) { + await this.manualSync.task.stop(); + this.updatePreview([]); + this._onDidCompleteManualSync.fire(error); } } @@ -636,7 +642,7 @@ class UserDataSyncPreview extends Disposable implements IUserDataSyncPreview { } await this.manualSync.task.stop(); this.updatePreview([]); - this._onDidCompleteManualSync.fire(false); + this._onDidCompleteManualSync.fire(canceled()); } async pull(): Promise {