diff --git a/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts b/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts index e401fb270aa..5ea0fe40224 100644 --- a/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts +++ b/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts @@ -60,7 +60,7 @@ export class UserDataAutoSyncService extends Disposable implements IUserDataAuto if (this.enabled) { try { if (auto) { - if (await this.isTurnedOffEverywhere()) { + if (await this.userDataSyncService.isTurnedOffEverywhere()) { // Turned off everywhere. Reset & Stop Sync. this.logService.info('Auto Sync: Turning off sync as it is turned off everywhere.'); await this.userDataSyncService.resetLocal(); @@ -88,12 +88,6 @@ export class UserDataAutoSyncService extends Disposable implements IUserDataAuto } } - private async isTurnedOffEverywhere(): Promise { - const hasRemote = await this.userDataSyncService.hasRemoteData(); - const hasPreviouslySynced = await this.userDataSyncService.hasPreviouslySynced(); - return !hasRemote && hasPreviouslySynced; - } - private async isAutoSyncEnabled(): Promise { return this.configurationService.getValue('sync.enable') && this.userDataSyncService.status !== SyncStatus.Uninitialized diff --git a/src/vs/platform/userDataSync/common/userDataSync.ts b/src/vs/platform/userDataSync/common/userDataSync.ts index 2b2f9e6314e..5580f2cfbf3 100644 --- a/src/vs/platform/userDataSync/common/userDataSync.ts +++ b/src/vs/platform/userDataSync/common/userDataSync.ts @@ -201,36 +201,50 @@ export const enum SyncStatus { HasConflicts = 'hasConflicts', } -export interface ISynchroniser { +export interface IUserDataSynchroniser { + + readonly source: SyncSource; readonly status: SyncStatus; readonly onDidChangeStatus: Event; readonly onDidChangeLocal: Event; + pull(): Promise; push(): Promise; sync(): Promise; stop(): Promise; + hasPreviouslySynced(): Promise hasRemoteData(): Promise; hasLocalData(): Promise; resetLocal(): Promise; -} -export interface IUserDataSynchroniser extends ISynchroniser { - readonly source: SyncSource; getRemoteContent(preivew?: boolean): Promise; accept(content: string): Promise; } export const IUserDataSyncService = createDecorator('IUserDataSyncService'); -export interface IUserDataSyncService extends ISynchroniser { +export interface IUserDataSyncService { _serviceBrand: any; + + readonly status: SyncStatus; + readonly onDidChangeStatus: Event; + readonly conflictsSources: SyncSource[]; readonly onDidChangeConflicts: Event; - isFirstTimeSyncAndHasUserData(): Promise; - reset(): Promise; - resetLocal(): Promise; + + readonly onDidChangeLocal: Event; + + pull(): Promise; + sync(): Promise; + stop(): Promise; + getRemoteContent(source: SyncSource, preview: boolean): Promise; accept(source: SyncSource, content: string): Promise; + + isFirstTimeSyncWithMerge(): Promise; + isTurnedOffEverywhere(): Promise; + reset(): Promise; + resetLocal(): Promise; } export const IUserDataAutoSyncService = createDecorator('IUserDataAutoSyncService'); diff --git a/src/vs/platform/userDataSync/common/userDataSyncIpc.ts b/src/vs/platform/userDataSync/common/userDataSyncIpc.ts index a41a0ed7b7c..8614ab738e7 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncIpc.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncIpc.ts @@ -29,15 +29,12 @@ export class UserDataSyncChannel implements IServerChannel { case 'sync': return this.service.sync(); case 'accept': return this.service.accept(args[0], args[1]); case 'pull': return this.service.pull(); - case 'push': return this.service.push(); case 'stop': this.service.stop(); return Promise.resolve(); case 'reset': return this.service.reset(); case 'resetLocal': return this.service.resetLocal(); - case 'hasPreviouslySynced': return this.service.hasPreviouslySynced(); - case 'hasRemoteData': return this.service.hasRemoteData(); - case 'hasLocalData': return this.service.hasLocalData(); + case 'isTurnedOffEverywhere': return this.service.isTurnedOffEverywhere(); case 'getRemoteContent': return this.service.getRemoteContent(args[0], args[1]); - case 'isFirstTimeSyncAndHasUserData': return this.service.isFirstTimeSyncAndHasUserData(); + case 'isFirstTimeSyncWithMerge': return this.service.isFirstTimeSyncWithMerge(); } throw new Error('Invalid call'); } diff --git a/src/vs/platform/userDataSync/common/userDataSyncService.ts b/src/vs/platform/userDataSync/common/userDataSyncService.ts index 25a4e08288c..d99f1c348b0 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncService.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncService.ts @@ -143,13 +143,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ return false; } - async hasRemoteData(): Promise { - if (!this.userDataSyncStoreService.userDataSyncStore) { - throw new Error('Not enabled'); - } - if (!(await this.userDataAuthTokenService.getToken())) { - throw new Error('Not Authenticated. Please sign in to start sync.'); - } + private async hasRemoteData(): Promise { for (const synchroniser of this.synchronisers) { if (await synchroniser.hasRemoteData()) { return true; @@ -158,7 +152,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ return false; } - async hasLocalData(): Promise { + private async hasLocalData(): Promise { if (!this.userDataSyncStoreService.userDataSyncStore) { throw new Error('Not enabled'); } @@ -182,19 +176,34 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ return null; } - async isFirstTimeSyncAndHasUserData(): Promise { + async isFirstTimeSyncWithMerge(): Promise { if (!this.userDataSyncStoreService.userDataSyncStore) { throw new Error('Not enabled'); } if (!(await this.userDataAuthTokenService.getToken())) { throw new Error('Not Authenticated. Please sign in to start sync.'); } + if (!await this.hasRemoteData()) { + return false; + } if (await this.hasPreviouslySynced()) { return false; } return await this.hasLocalData(); } + async isTurnedOffEverywhere(): Promise { + if (!this.userDataSyncStoreService.userDataSyncStore) { + throw new Error('Not enabled'); + } + if (!(await this.userDataAuthTokenService.getToken())) { + throw new Error('Not Authenticated. Please sign in to start sync.'); + } + const hasRemote = await this.hasRemoteData(); + const hasPreviouslySynced = await this.hasPreviouslySynced(); + return !hasRemote && hasPreviouslySynced; + } + async reset(): Promise { await this.resetRemote(); await this.resetLocal(); diff --git a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts index 28f18e5a8aa..06e6bb5f764 100644 --- a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts +++ b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts @@ -444,12 +444,8 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo } private async handleFirstTimeSync(): Promise { - const hasRemote = await this.userDataSyncService.hasRemoteData(); - if (!hasRemote) { - return; - } - const isFirstSyncAndHasUserData = await this.userDataSyncService.isFirstTimeSyncAndHasUserData(); - if (!isFirstSyncAndHasUserData) { + const isFirstSyncWithMerge = await this.userDataSyncService.isFirstTimeSyncWithMerge(); + if (!isFirstSyncWithMerge) { return; } const result = await this.dialogService.show( diff --git a/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncService.ts b/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncService.ts index b633f233998..ae6c75d1d9d 100644 --- a/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncService.ts +++ b/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncService.ts @@ -55,10 +55,6 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ return this.channel.call('pull'); } - push(): Promise { - return this.channel.call('push'); - } - sync(): Promise { return this.channel.call('sync'); } @@ -79,24 +75,16 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ return this.channel.call('stop'); } - hasPreviouslySynced(): Promise { - return this.channel.call('hasPreviouslySynced'); - } - - hasRemoteData(): Promise { - return this.channel.call('hasRemoteData'); - } - - hasLocalData(): Promise { - return this.channel.call('hasLocalData'); + isTurnedOffEverywhere(): Promise { + return this.channel.call('isTurnedOffEverywhere'); } getRemoteContent(source: SyncSource, preview: boolean): Promise { return this.channel.call('getRemoteContent', [source, preview]); } - isFirstTimeSyncAndHasUserData(): Promise { - return this.channel.call('isFirstTimeSyncAndHasUserData'); + isFirstTimeSyncWithMerge(): Promise { + return this.channel.call('isFirstTimeSyncWithMerge'); } private async updateStatus(status: SyncStatus): Promise {