diff --git a/src/vs/platform/userDataSync/common/userDataSyncService.ts b/src/vs/platform/userDataSync/common/userDataSyncService.ts index aa17e650d72975d0cf2bc94feb6dacf7725d9dbb..c2508e82b78bbcec018250d6944d9dff8d0da105 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncService.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncService.ts @@ -96,26 +96,40 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ async pull(): Promise { await this.checkEnablement(); - for (const synchroniser of this.synchronisers) { - try { - await synchroniser.pull(); - } catch (e) { - this.handleSynchronizerError(e, synchroniser.resource); + try { + for (const synchroniser of this.synchronisers) { + try { + await synchroniser.pull(); + } catch (e) { + this.handleSynchronizerError(e, synchroniser.resource); + } } + this.updateLastSyncTime(); + } catch (error) { + if (error instanceof UserDataSyncError) { + this.telemetryService.publicLog2<{ resource?: string }, SyncClassification>(`sync/error/${UserDataSyncErrorCode.TooLarge}`, { resource: error.resource }); + } + throw error; } - this.updateLastSyncTime(); } async push(): Promise { await this.checkEnablement(); - for (const synchroniser of this.synchronisers) { - try { - await synchroniser.push(); - } catch (e) { - this.handleSynchronizerError(e, synchroniser.resource); + try { + for (const synchroniser of this.synchronisers) { + try { + await synchroniser.push(); + } catch (e) { + this.handleSynchronizerError(e, synchroniser.resource); + } } + this.updateLastSyncTime(); + } catch (error) { + if (error instanceof UserDataSyncError) { + this.telemetryService.publicLog2<{ resource?: string }, SyncClassification>(`sync/error/${UserDataSyncErrorCode.TooLarge}`, { resource: error.resource }); + } + throw error; } - this.updateLastSyncTime(); } private recoveredSettings: boolean = false; diff --git a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts index ee6a4def68c13cb6afceaae65ac376bcb03f0b04..27f7095a4516791381b4e554ec13cf825001f576 100644 --- a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts +++ b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts @@ -136,7 +136,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo this.userDataSyncWorkbenchService.onDidChangeAccountStatus )(() => this.updateBadge())); this._register(userDataSyncService.onDidChangeConflicts(() => this.onDidChangeConflicts(this.userDataSyncService.conflicts))); - this._register(userDataSyncService.onSyncErrors(errors => this.onSyncErrors(errors))); + this._register(userDataSyncService.onSyncErrors(errors => this.onSynchronizerErrors(errors))); this._register(userDataAutoSyncService.onError(error => this.onAutoSyncError(error))); this.registerActions(); @@ -261,7 +261,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo } } - private onAutoSyncError(error: UserDataSyncError): void { + private onAutoSyncError(error: UserDataSyncError): boolean { switch (error.code) { case UserDataSyncErrorCode.TurnedOff: case UserDataSyncErrorCode.SessionExpired: @@ -272,7 +272,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo primary: [new Action('turn on sync', localize('turn on sync', "Turn on Preferences Sync..."), undefined, true, () => this.turnOn())] } }); - return; + return true; case UserDataSyncErrorCode.TooLarge: if (error.resource === SyncResource.Keybindings || error.resource === SyncResource.Settings) { this.disableSync(error.resource); @@ -286,20 +286,21 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo } }); } - return; + return true; case UserDataSyncErrorCode.Incompatible: case UserDataSyncErrorCode.UpgradeRequired: this.disableSync(); this.notificationService.notify({ severity: Severity.Error, - message: localize('error upgrade required', "Turned off sync because the current version of {0} (version {1}) is not compatible with the Preferences Sync Service. Please update {2} and turn on sync to continue syncing.", this.productService.nameLong, this.productService.version, this.productService.nameLong), + message: localize('error upgrade required', "Turned off sync because the current version ({0}) of {1} is not compatible with the Preferences Sync Service. Please update and turn on sync to continue syncing.", this.productService.version, this.productService.nameLong), }); - return; + return true; } + return false; } private readonly invalidContentErrorDisposables = new Map(); - private onSyncErrors(errors: [SyncResource, UserDataSyncError][]): void { + private onSynchronizerErrors(errors: [SyncResource, UserDataSyncError][]): void { if (errors.length) { for (const [source, error] of errors) { switch (error.code) { @@ -393,6 +394,14 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo } await this.userDataSyncWorkbenchService.turnOn(); this.storageService.store('sync.donotAskPreviewConfirmation', true, StorageScope.GLOBAL); + } catch (e) { + if (isPromiseCanceledError(e)) { + return; + } + if (e instanceof UserDataSyncError && this.onAutoSyncError(e)) { + return; + } + this.notificationService.error(localize('turn on failed', "Error while starting Sync: {0}", toErrorMessage(e))); } finally { this.turningOnSync = false; } @@ -617,15 +626,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo private registerTurnOnSyncAction(): void { const turnOnSyncWhenContext = ContextKeyExpr.and(CONTEXT_SYNC_STATE.notEqualsTo(SyncStatus.Uninitialized), CONTEXT_SYNC_ENABLEMENT.toNegated(), CONTEXT_ACCOUNT_STATE.notEqualsTo(AccountStatus.Uninitialized), CONTEXT_TURNING_ON_STATE.negate()); - CommandsRegistry.registerCommand(turnOnSyncCommand.id, async () => { - try { - await this.turnOn(); - } catch (e) { - if (!isPromiseCanceledError(e)) { - this.notificationService.error(localize('turn on failed', "Error while starting Sync: {0}", toErrorMessage(e))); - } - } - }); + CommandsRegistry.registerCommand(turnOnSyncCommand.id, () => this.turnOn()); MenuRegistry.appendMenuItem(MenuId.GlobalActivity, { group: '5_sync', command: {