diff --git a/src/vs/platform/userDataSync/common/abstractSynchronizer.ts b/src/vs/platform/userDataSync/common/abstractSynchronizer.ts index cb3e1dc35e1..54e3ef5bf78 100644 --- a/src/vs/platform/userDataSync/common/abstractSynchronizer.ts +++ b/src/vs/platform/userDataSync/common/abstractSynchronizer.ts @@ -152,15 +152,14 @@ export abstract class AbstractSynchroniser extends Disposable { return !!lastSyncData; } - async getRemoteContent(): Promise { - const lastSyncData = await this.getLastSyncUserData(); - const { syncData } = await this.getRemoteUserData(lastSyncData); - return syncData ? syncData.content : null; + async getRemoteContentFromPreview(): Promise { + return null; } - async resolveContent(ref: string): Promise { - const { syncData } = await this.getRemoteUserData(ref); - return syncData ? syncData.content : null; + async getRemoteContent(ref?: string): Promise { + const refOrLastSyncUserData: string | IRemoteUserData | null = ref || await this.getLastSyncUserData(); + const { content } = await this.getUserData(refOrLastSyncUserData); + return content; } async resetLocal(): Promise { @@ -195,20 +194,8 @@ export abstract class AbstractSynchroniser extends Disposable { await this.fileService.writeFile(this.lastSyncResource, VSBuffer.fromString(JSON.stringify(lastSyncUserData))); } - protected async getRemoteUserData(ref: string): Promise - protected async getRemoteUserData(lastSyncData: IRemoteUserData | null): Promise - protected async getRemoteUserData(arg: string | IRemoteUserData | null): Promise { - let ref: string; - let content: string | null = null; - if (isString(arg)) { - ref = arg; - content = await this.userDataSyncStoreService.resolveContent(this.resourceKey, ref); - } else { - const lastSyncUserData: IUserData | null = arg ? { ref: arg.ref, content: arg.syncData ? JSON.stringify(arg.syncData) : null } : null; - const userData = await this.userDataSyncStoreService.read(this.resourceKey, lastSyncUserData, this.source); - ref = userData.ref; - content = userData.content; - } + protected async getRemoteUserData(lastSyncData: IRemoteUserData | null): Promise { + const { ref, content } = await this.getUserData(lastSyncData); let syncData: ISyncData | null = null; if (content !== null) { try { @@ -226,6 +213,16 @@ export abstract class AbstractSynchroniser extends Disposable { return { ref, syncData }; } + private async getUserData(refOrLastSyncData: string | IRemoteUserData | null): Promise { + if (isString(refOrLastSyncData)) { + const content = await this.userDataSyncStoreService.resolveContent(this.resourceKey, refOrLastSyncData); + return { ref: refOrLastSyncData, content }; + } else { + const lastSyncUserData: IUserData | null = refOrLastSyncData ? { ref: refOrLastSyncData.ref, content: refOrLastSyncData.syncData ? JSON.stringify(refOrLastSyncData.syncData) : null } : null; + return this.userDataSyncStoreService.read(this.resourceKey, lastSyncUserData, this.source); + } + } + protected async updateRemoteUserData(content: string, ref: string | null): Promise { const syncData: ISyncData = { version: this.version, content }; ref = await this.userDataSyncStoreService.write(this.resourceKey, JSON.stringify(syncData), ref, this.source); @@ -282,14 +279,12 @@ export abstract class AbstractFileSynchroniser extends AbstractSynchroniser { this.setStatus(SyncStatus.Idle); } - async getRemoteContent(preview?: boolean): Promise { - if (preview) { - if (this.syncPreviewResultPromise) { - const result = await this.syncPreviewResultPromise; - return result.remoteUserData && result.remoteUserData.syncData ? result.remoteUserData.syncData.content : null; - } + async getRemoteContentFromPreview(): Promise { + if (this.syncPreviewResultPromise) { + const result = await this.syncPreviewResultPromise; + return result.remoteUserData && result.remoteUserData.syncData ? result.remoteUserData.syncData.content : null; } - return super.getRemoteContent(); + return null; } protected async getLocalFileContent(): Promise { diff --git a/src/vs/platform/userDataSync/common/extensionsSync.ts b/src/vs/platform/userDataSync/common/extensionsSync.ts index d953a8c7d93..2a3d640c6e0 100644 --- a/src/vs/platform/userDataSync/common/extensionsSync.ts +++ b/src/vs/platform/userDataSync/common/extensionsSync.ts @@ -136,10 +136,6 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse return false; } - async getRemoteContent(): Promise { - return null; - } - protected async performSync(remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null): Promise { const previewResult = await this.getPreview(remoteUserData, lastSyncUserData); await this.apply(previewResult); diff --git a/src/vs/platform/userDataSync/common/globalStateSync.ts b/src/vs/platform/userDataSync/common/globalStateSync.ts index cef7d798ab5..01a8d964fc8 100644 --- a/src/vs/platform/userDataSync/common/globalStateSync.ts +++ b/src/vs/platform/userDataSync/common/globalStateSync.ts @@ -120,10 +120,6 @@ export class GlobalStateSynchroniser extends AbstractSynchroniser implements IUs return false; } - async getRemoteContent(): Promise { - return null; - } - protected async performSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { const result = await this.getPreview(remoteUserData, lastSyncUserData); await this.apply(result); diff --git a/src/vs/platform/userDataSync/common/keybindingsSync.ts b/src/vs/platform/userDataSync/common/keybindingsSync.ts index 5726f7d1b35..d6bd759c239 100644 --- a/src/vs/platform/userDataSync/common/keybindingsSync.ts +++ b/src/vs/platform/userDataSync/common/keybindingsSync.ts @@ -156,13 +156,8 @@ export class KeybindingsSynchroniser extends AbstractJsonFileSynchroniser implem return false; } - async getRemoteContent(preview?: boolean): Promise { - const content = await super.getRemoteContent(preview); - return content !== null ? this.getKeybindingsContentFromSyncContent(content) : null; - } - - async resolveContent(ref: string): Promise { - let content = await super.resolveContent(ref); + async getRemoteContentFromPreview(): Promise { + const content = await super.getRemoteContentFromPreview(); return content !== null ? this.getKeybindingsContentFromSyncContent(content) : null; } diff --git a/src/vs/platform/userDataSync/common/settingsSync.ts b/src/vs/platform/userDataSync/common/settingsSync.ts index edeac6292ff..c1876d666f1 100644 --- a/src/vs/platform/userDataSync/common/settingsSync.ts +++ b/src/vs/platform/userDataSync/common/settingsSync.ts @@ -187,13 +187,13 @@ export class SettingsSynchroniser extends AbstractJsonFileSynchroniser implement return false; } - async getRemoteContent(preview?: boolean): Promise { - let content = await super.getRemoteContent(preview); + async getRemoteContentFromPreview(): Promise { + let content = await super.getRemoteContentFromPreview(); if (content !== null) { const settingsSyncContent = this.parseSettingsSyncContent(content); content = settingsSyncContent ? settingsSyncContent.settings : null; } - if (preview && content !== null) { + if (content !== null) { const formatUtils = await this.getFormattingOptions(); // remove ignored settings from the remote content for preview const ignoredSettings = await this.getIgnoredSettings(); @@ -202,15 +202,6 @@ export class SettingsSynchroniser extends AbstractJsonFileSynchroniser implement return content; } - async resolveContent(ref: string): Promise { - let content = await super.resolveContent(ref); - if (content !== null) { - const settingsSyncContent = this.parseSettingsSyncContent(content); - content = settingsSyncContent ? settingsSyncContent.settings : null; - } - return content; - } - async accept(content: string): Promise { if (this.status === SyncStatus.HasConflicts) { const preview = await this.syncPreviewResultPromise!; diff --git a/src/vs/platform/userDataSync/common/userDataSync.ts b/src/vs/platform/userDataSync/common/userDataSync.ts index 7094cd20651..30c25f16104 100644 --- a/src/vs/platform/userDataSync/common/userDataSync.ts +++ b/src/vs/platform/userDataSync/common/userDataSync.ts @@ -18,7 +18,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IStringDictionary } from 'vs/base/common/collections'; import { FormattingOptions } from 'vs/base/common/jsonFormatter'; import { URI } from 'vs/base/common/uri'; -import { isEqual, joinPath } from 'vs/base/common/resources'; +import { isEqual, joinPath, dirname, basename } from 'vs/base/common/resources'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IProductService } from 'vs/platform/product/common/productService'; import { distinct } from 'vs/base/common/arrays'; @@ -254,8 +254,8 @@ export interface IUserDataSynchroniser { hasLocalData(): Promise; resetLocal(): Promise; - getRemoteContent(preivew?: boolean): Promise; - resolveContent(ref: string): Promise; + getRemoteContentFromPreview(): Promise; + getRemoteContent(ref?: string): Promise; accept(content: string): Promise; } @@ -300,8 +300,7 @@ export interface IUserDataSyncService { resetLocal(): Promise; isFirstTimeSyncWithMerge(): Promise; - getRemoteContent(source: SyncSource, preview: boolean): Promise; - resolveContent(resource: ResourceKey, ref: string): Promise; + resolveContent(resource: URI): Promise; accept(source: SyncSource, content: string): Promise; } @@ -343,12 +342,23 @@ export const CONTEXT_SYNC_STATE = new RawContextKey('syncStatus', SyncSt export const CONTEXT_SYNC_ENABLEMENT = new RawContextKey('syncEnabled', false); export const USER_DATA_SYNC_SCHEME = 'vscode-userdata-sync'; -export function toRemoteContentResource(source: SyncSource): URI { - return URI.from({ scheme: USER_DATA_SYNC_SCHEME, path: `${source}/remoteContent` }); +export const PREVIEW_QUERY = 'preview=true'; +export function toSyncResourceFromSource(source: SyncSource, ref?: string): URI { + return toSyncResource(getResourceKey(source), ref); } -export function getSyncSourceFromRemoteContentResource(uri: URI): SyncSource | undefined { - return [SyncSource.Settings, SyncSource.Keybindings, SyncSource.Extensions, SyncSource.GlobalState].filter(source => isEqual(uri, toRemoteContentResource(source)))[0]; +export function toSyncResource(resourceKey: ResourceKey, ref?: string): URI { + return URI.from({ scheme: USER_DATA_SYNC_SCHEME, path: `${resourceKey}/${ref ? ref : 'latest'}` }); } + +export function resolveSyncResource(resource: URI): { resourceKey: ResourceKey, ref?: string, query?: string } | null { + const resourceKey: ResourceKey = basename(dirname(resource)) as ResourceKey; + const ref = basename(resource); + if (resourceKey && ref) { + return { resourceKey, ref: ref !== 'latest' ? ref : undefined, query: resource.query }; + } + return null; +} + export function getSyncSourceFromPreviewResource(uri: URI, environmentService: IEnvironmentService): SyncSource | undefined { if (isEqual(uri, environmentService.settingsSyncPreviewResource)) { return SyncSource.Settings; @@ -358,3 +368,19 @@ export function getSyncSourceFromPreviewResource(uri: URI, environmentService: I } return undefined; } +export function getResourceKey(source: SyncSource): ResourceKey { + switch (source) { + case SyncSource.Settings: return 'settings'; + case SyncSource.Keybindings: return 'keybindings'; + case SyncSource.Extensions: return 'extensions'; + case SyncSource.GlobalState: return 'globalState'; + } +} +export function getSyncSource(resourceKey: ResourceKey): SyncSource { + switch (resourceKey) { + case 'settings': return SyncSource.Settings; + case 'keybindings': return SyncSource.Keybindings; + case 'extensions': return SyncSource.Extensions; + case 'globalState': return SyncSource.GlobalState; + } +} diff --git a/src/vs/platform/userDataSync/common/userDataSyncIpc.ts b/src/vs/platform/userDataSync/common/userDataSyncIpc.ts index 678056671cf..2f25ff6ae66 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncIpc.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncIpc.ts @@ -34,8 +34,7 @@ export class UserDataSyncChannel implements IServerChannel { case 'stop': this.service.stop(); return Promise.resolve(); case 'reset': return this.service.reset(); case 'resetLocal': return this.service.resetLocal(); - case 'getRemoteContent': return this.service.getRemoteContent(args[0], args[1]); - case 'resolveContent': return this.service.resolveContent(args[0], args[1]); + case 'resolveContent': return this.service.resolveContent(URI.revive(args[0])); case 'isFirstTimeSyncWithMerge': return this.service.isFirstTimeSyncWithMerge(); } throw new Error('Invalid call'); @@ -68,8 +67,8 @@ export class SettingsSyncChannel implements IServerChannel { case 'hasPreviouslySynced': return this.service.hasPreviouslySynced(); case 'hasLocalData': return this.service.hasLocalData(); case 'resolveSettingsConflicts': return this.service.resolveSettingsConflicts(args[0]); + case 'getRemoteContentFromPreview': return this.service.getRemoteContentFromPreview(); case 'getRemoteContent': return this.service.getRemoteContent(args[0]); - case 'resolveContent': return this.service.resolveContent(args[0]); } throw new Error('Invalid call'); } diff --git a/src/vs/platform/userDataSync/common/userDataSyncService.ts b/src/vs/platform/userDataSync/common/userDataSyncService.ts index da8cb31aa1b..0928911e167 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncService.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IUserDataSyncService, SyncStatus, IUserDataSyncStoreService, SyncSource, ISettingsSyncService, IUserDataSyncLogService, IUserDataSynchroniser, UserDataSyncStoreError, UserDataSyncErrorCode, UserDataSyncError, ResourceKey } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncService, SyncStatus, IUserDataSyncStoreService, SyncSource, ISettingsSyncService, IUserDataSyncLogService, IUserDataSynchroniser, UserDataSyncStoreError, UserDataSyncErrorCode, UserDataSyncError, resolveSyncResource, PREVIEW_QUERY } from 'vs/platform/userDataSync/common/userDataSync'; import { Disposable } from 'vs/base/common/lifecycle'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { Emitter, Event } from 'vs/base/common/event'; @@ -15,6 +15,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { equals } from 'vs/base/common/arrays'; import { localize } from 'vs/nls'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; +import { URI } from 'vs/base/common/uri'; type SyncErrorClassification = { source: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; @@ -176,24 +177,20 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ await synchroniser.accept(content); } - async getRemoteContent(source: SyncSource, preview: boolean): Promise { - await this.checkEnablement(); - for (const synchroniser of this.synchronisers) { - if (synchroniser.source === source) { - return synchroniser.getRemoteContent(preview); + async resolveContent(resource: URI): Promise { + const result = resolveSyncResource(resource); + if (result) { + const synchronizer = this.synchronisers.filter(s => s.resourceKey === result.resourceKey)[0]; + if (synchronizer) { + if (PREVIEW_QUERY === result.query) { + return synchronizer.getRemoteContentFromPreview(); + } + return synchronizer.getRemoteContent(result.ref); } } return null; } - async resolveContent(resourceKey: ResourceKey, ref: string): Promise { - const synchronizer = this.synchronisers.filter(s => s.resourceKey === resourceKey)[0]; - if (synchronizer) { - return synchronizer.resolveContent(ref); - } - return null; - } - async isFirstTimeSyncWithMerge(): Promise { await this.checkEnablement(); if (!await this.userDataSyncStoreService.manifest()) { diff --git a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts index 0fd29982702..e24b4fcfbf1 100644 --- a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts +++ b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts @@ -9,7 +9,7 @@ import { canceled, isPromiseCanceledError } from 'vs/base/common/errors'; import { Event } from 'vs/base/common/event'; import { Disposable, DisposableStore, dispose, MutableDisposable, toDisposable, IDisposable } from 'vs/base/common/lifecycle'; import { isWeb } from 'vs/base/common/platform'; -import { isEqual, dirname, basename } from 'vs/base/common/resources'; +import { isEqual } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import type { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { registerEditorContribution, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; @@ -30,7 +30,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { IQuickInputService, IQuickPickItem, IQuickPickSeparator } from 'vs/platform/quickinput/common/quickInput'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { CONTEXT_SYNC_STATE, getSyncSourceFromRemoteContentResource, getUserDataSyncStore, ISyncConfiguration, IUserDataAutoSyncService, IUserDataSyncService, IUserDataSyncStore, registerConfiguration, SyncSource, SyncStatus, toRemoteContentResource, UserDataSyncError, UserDataSyncErrorCode, USER_DATA_SYNC_SCHEME, IUserDataSyncEnablementService, ResourceKey, getSyncSourceFromPreviewResource, CONTEXT_SYNC_ENABLEMENT } from 'vs/platform/userDataSync/common/userDataSync'; +import { CONTEXT_SYNC_STATE, getUserDataSyncStore, ISyncConfiguration, IUserDataAutoSyncService, IUserDataSyncService, IUserDataSyncStore, registerConfiguration, SyncSource, SyncStatus, UserDataSyncError, UserDataSyncErrorCode, USER_DATA_SYNC_SCHEME, IUserDataSyncEnablementService, ResourceKey, getSyncSourceFromPreviewResource, CONTEXT_SYNC_ENABLEMENT, toSyncResourceFromSource, PREVIEW_QUERY, resolveSyncResource, getSyncSource } from 'vs/platform/userDataSync/common/userDataSync'; import { FloatingClickWidget } from 'vs/workbench/browser/parts/editor/editorWidgets'; import { GLOBAL_ACTIVITY_ID } from 'vs/workbench/common/activity'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; @@ -354,7 +354,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo private async acceptRemote(syncSource: SyncSource) { try { - const contents = await this.userDataSyncService.getRemoteContent(syncSource, false); + const contents = await this.userDataSyncService.resolveContent(toSyncResourceFromSource(syncSource).with({ query: PREVIEW_QUERY })); if (contents) { await this.userDataSyncService.accept(syncSource, contents); } @@ -754,7 +754,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo label = localize('keybindings conflicts preview', "Keybindings Conflicts (Remote ↔ Local)"); } if (previewResource) { - const remoteContentResource = toRemoteContentResource(source); + const remoteContentResource = toSyncResourceFromSource(source).with({ query: PREVIEW_QUERY }); await this.editorService.openEditor({ leftResource: remoteContentResource, rightResource: previewResource, @@ -1056,20 +1056,8 @@ class UserDataRemoteContentProvider implements ITextModelContentProvider { } provideTextContent(uri: URI): Promise | null { - let promise: Promise | undefined; - if (isEqual(uri, toRemoteContentResource(SyncSource.Settings))) { - promise = this.userDataSyncService.getRemoteContent(SyncSource.Settings, true); - } else if (isEqual(uri, toRemoteContentResource(SyncSource.Keybindings))) { - promise = this.userDataSyncService.getRemoteContent(SyncSource.Keybindings, true); - } else { - const resourceKey: ResourceKey = basename(dirname(uri)) as ResourceKey; - const ref = basename(uri); - if (resourceKey && ref) { - promise = this.userDataSyncService.resolveContent(resourceKey, ref); - } - } - if (promise) { - return promise.then(content => this.modelService.createModel(content || '', this.modeService.create('jsonc'), uri)); + if (uri.scheme === USER_DATA_SYNC_SCHEME) { + return this.userDataSyncService.resolveContent(uri).then(content => this.modelService.createModel(content || '', this.modeService.create('jsonc'), uri)); } return null; } @@ -1125,7 +1113,7 @@ class AcceptChangesContribution extends Disposable implements IEditorContributio return true; } - if (getSyncSourceFromRemoteContentResource(model.uri) !== undefined) { + if (resolveSyncResource(model.uri)?.query === PREVIEW_QUERY) { return this.configurationService.getValue('diffEditor.renderSideBySide'); } @@ -1135,14 +1123,14 @@ class AcceptChangesContribution extends Disposable implements IEditorContributio private createAcceptChangesWidgetRenderer(): void { if (!this.acceptChangesButton) { - const isRemote = getSyncSourceFromRemoteContentResource(this.editor.getModel()!.uri) !== undefined; + const isRemote = resolveSyncResource(this.editor.getModel()!.uri) !== null; const acceptRemoteLabel = localize('accept remote', "Accept Remote"); const acceptLocalLabel = localize('accept local', "Accept Local"); this.acceptChangesButton = this.instantiationService.createInstance(FloatingClickWidget, this.editor, isRemote ? acceptRemoteLabel : acceptLocalLabel, null); this._register(this.acceptChangesButton.onClick(async () => { const model = this.editor.getModel(); if (model) { - const conflictsSource = (getSyncSourceFromPreviewResource(model.uri, this.environmentService) || getSyncSourceFromRemoteContentResource(model.uri))!; + const conflictsSource = (getSyncSourceFromPreviewResource(model.uri, this.environmentService) || getSyncSource(resolveSyncResource(model.uri)!.resourceKey))!; this.telemetryService.publicLog2<{ source: string, action: string }, SyncConflictsClassification>('sync/handleConflicts', { source: conflictsSource, action: isRemote ? 'acceptRemote' : 'acceptLocal' }); const syncAreaLabel = getSyncAreaLabel(conflictsSource); const result = await this.dialogService.confirm({ diff --git a/src/vs/workbench/contrib/userDataSync/browser/userDataSyncHistory.ts b/src/vs/workbench/contrib/userDataSync/browser/userDataSyncHistory.ts index f72aa2e5c1f..1be5e2cced4 100644 --- a/src/vs/workbench/contrib/userDataSync/browser/userDataSyncHistory.ts +++ b/src/vs/workbench/contrib/userDataSync/browser/userDataSyncHistory.ts @@ -11,7 +11,7 @@ import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { TreeViewPane, TreeView } from 'vs/workbench/browser/parts/views/treeView'; import { VIEW_CONTAINER } from 'vs/workbench/contrib/files/browser/explorerViewlet'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { ALL_RESOURCE_KEYS, CONTEXT_SYNC_ENABLEMENT, IUserDataSyncStoreService, USER_DATA_SYNC_SCHEME, ResourceKey } from 'vs/platform/userDataSync/common/userDataSync'; +import { ALL_RESOURCE_KEYS, CONTEXT_SYNC_ENABLEMENT, IUserDataSyncStoreService, ResourceKey, toSyncResource } from 'vs/platform/userDataSync/common/userDataSync'; import { registerAction2, Action2, MenuId } from 'vs/platform/actions/common/actions'; import { IContextKeyService, RawContextKey, ContextKeyExpr, ContextKeyEqualsExpr } from 'vs/platform/contextkey/common/contextkey'; import { URI } from 'vs/base/common/uri'; @@ -141,12 +141,11 @@ class UserDataSyncHistoryViewDataProvider implements ITreeViewDataProvider { if (resourceKey) { const refs = await this.userDataSyncStoreService.getAllRefs(resourceKey); return refs.map(ref => { - const resourceUri = URI.from({ scheme: USER_DATA_SYNC_SCHEME, path: `${resourceKey}/${ref}` }); + const resourceUri = toSyncResource(resourceKey, ref); return { handle: `${resourceKey}/${ref}`, collapsibleState: TreeItemCollapsibleState.None, label: { label: ref }, - resourceUri, command: { id: 'workbench.actions.openRef', title: '', arguments: [resourceUri] }, themeIcon: FileThemeIcon, contextValue: `syncref-${resourceKey}` diff --git a/src/vs/workbench/services/userDataSync/electron-browser/settingsSyncService.ts b/src/vs/workbench/services/userDataSync/electron-browser/settingsSyncService.ts index b35d77dcde4..429517bea3e 100644 --- a/src/vs/workbench/services/userDataSync/electron-browser/settingsSyncService.ts +++ b/src/vs/workbench/services/userDataSync/electron-browser/settingsSyncService.ts @@ -84,12 +84,12 @@ export class SettingsSyncService extends Disposable implements ISettingsSyncServ return this.channel.call('resolveConflicts', [conflicts]); } - getRemoteContent(preview?: boolean): Promise { - return this.channel.call('getRemoteContent', [!!preview]); + getRemoteContent(ref?: string): Promise { + return this.channel.call('getRemoteContent', [ref]); } - resolveContent(ref: string): Promise { - return this.channel.call('resolveContent', [ref]); + getRemoteContentFromPreview(): Promise { + return this.channel.call('getRemoteContentFromPreview', []); } private async updateStatus(status: SyncStatus): Promise { diff --git a/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncService.ts b/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncService.ts index 8199966d278..686866cfc79 100644 --- a/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncService.ts +++ b/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncService.ts @@ -3,13 +3,14 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SyncStatus, SyncSource, IUserDataSyncService, UserDataSyncError, ResourceKey } from 'vs/platform/userDataSync/common/userDataSync'; +import { SyncStatus, SyncSource, IUserDataSyncService, UserDataSyncError } from 'vs/platform/userDataSync/common/userDataSync'; import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; import { Disposable } from 'vs/base/common/lifecycle'; import { Emitter, Event } from 'vs/base/common/event'; import { IChannel } from 'vs/base/parts/ipc/common/ipc'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { CancellationToken } from 'vs/base/common/cancellation'; +import { URI } from 'vs/base/common/uri'; export class UserDataSyncService extends Disposable implements IUserDataSyncService { @@ -88,12 +89,8 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ return this.channel.call('stop'); } - getRemoteContent(source: SyncSource, preview: boolean): Promise { - return this.channel.call('getRemoteContent', [source, preview]); - } - - resolveContent(key: ResourceKey, ref: string): Promise { - return this.channel.call('resolveContent', [key, ref]); + resolveContent(resource: URI): Promise { + return this.channel.call('resolveContent', [resource]); } isFirstTimeSyncWithMerge(): Promise {