diff --git a/src/vs/platform/userDataSync/common/extensionsSync.ts b/src/vs/platform/userDataSync/common/extensionsSync.ts index 2a3d640c6e0c15cf8bd39e91ab6471b229f1d48b..4a108b0814e26e6d803a5bd70082b064b15b793f 100644 --- a/src/vs/platform/userDataSync/common/extensionsSync.ts +++ b/src/vs/platform/userDataSync/common/extensionsSync.ts @@ -120,6 +120,21 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse async stop(): Promise { } + async getRemoteContent(ref?: string, fragment?: string): Promise { + const content = await super.getRemoteContent(ref); + if (content !== null && fragment) { + const syncData = this.parseSyncData(content); + if (syncData) { + switch (fragment) { + case 'extensions': + return syncData.content; + } + } + return null; + } + return content; + } + accept(content: string): Promise { throw new Error('Extensions: Conflicts should not occur'); } diff --git a/src/vs/platform/userDataSync/common/globalStateSync.ts b/src/vs/platform/userDataSync/common/globalStateSync.ts index 01a8d964fc89cf3a09f184928995dd01c8097cb9..d125cd05e4e5a26e18a94391e753f80d77f5160b 100644 --- a/src/vs/platform/userDataSync/common/globalStateSync.ts +++ b/src/vs/platform/userDataSync/common/globalStateSync.ts @@ -104,6 +104,21 @@ export class GlobalStateSynchroniser extends AbstractSynchroniser implements IUs async stop(): Promise { } + async getRemoteContent(ref?: string, fragment?: string): Promise { + let content = await super.getRemoteContent(ref); + if (content !== null && fragment) { + const syncData = this.parseSyncData(content); + if (syncData) { + switch (fragment) { + case 'globalState': + return syncData.content; + } + } + return null; + } + return content; + } + accept(content: string): Promise { throw new Error('UI State: Conflicts should not occur'); } diff --git a/src/vs/workbench/contrib/userDataSync/browser/userDataSyncHistory.ts b/src/vs/workbench/contrib/userDataSync/browser/userDataSyncHistory.ts index 09519bc05fdadec24201141af37b6a318a3d9192..f130aa5809c564e9b1d7df5128141597412a8851 100644 --- a/src/vs/workbench/contrib/userDataSync/browser/userDataSyncHistory.ts +++ b/src/vs/workbench/contrib/userDataSync/browser/userDataSyncHistory.ts @@ -81,13 +81,34 @@ export class UserDataSyncHistoryViewContribution implements IWorkbenchContributi registerAction2(class extends Action2 { constructor() { super({ - id: 'workbench.actions.openRef', - title: localize('workbench.action.openRef', "Open Ref"), + id: 'workbench.actions.sync.resolveResourceRef', + title: localize('workbench.actions.sync.resolveResourceRef', "Resolve Resource Ref"), }); } - async run(accessor: ServicesAccessor, resource: URI): Promise { + async run(accessor: ServicesAccessor, handle: TreeViewItemHandleArg): Promise { + const editorService = accessor.get(IEditorService); + let resource = URI.parse(handle.$treeItemHandle); + const result = resolveSyncResource(resource); + if (result) { + resource = resource.with({ fragment: result.resourceKey }); + await editorService.openEditor({ resource }); + } + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: 'workbench.actions.sync.resolveResourceRefCompletely', + title: localize('workbench.actions.sync.resolveResourceRefCompletely', "Show full content"), + menu: { + id: MenuId.ViewItemContext, + when: ContextKeyExpr.and(ContextKeyEqualsExpr.create('view', that.viewId), ContextKeyExpr.regex('viewItem', /syncref-.*/i)) + }, + }); + } + async run(accessor: ServicesAccessor, handle: TreeViewItemHandleArg): Promise { const editorService = accessor.get(IEditorService); - await editorService.openEditor({ resource }); + await editorService.openEditor({ resource: URI.parse(handle.$treeItemHandle) }); } }); registerAction2(class extends Action2 { @@ -107,15 +128,8 @@ export class UserDataSyncHistoryViewContribution implements IWorkbenchContributi const resource = URI.parse(handle.$treeItemHandle); const result = resolveSyncResource(resource); if (result) { - let leftResource: URI; - let rightResource: URI; - if (result.resourceKey === 'settings') { - leftResource = resource.with({ fragment: 'settings' }); - rightResource = environmentService.settingsResource; - } else { - leftResource = resource.with({ fragment: 'keybindings' }); - rightResource = environmentService.keybindingsResource; - } + const leftResource: URI = resource.with({ fragment: result.resourceKey }); + const rightResource: URI = result.resourceKey === 'settings' ? environmentService.settingsResource : environmentService.keybindingsResource; await editorService.openEditor({ leftResource, rightResource, @@ -157,12 +171,12 @@ class UserDataSyncHistoryViewDataProvider implements ITreeViewDataProvider { if (resourceKey) { const refs = await this.userDataSyncStoreService.getAllRefs(resourceKey); return refs.map(ref => { - const resourceUri = toSyncResource(resourceKey, ref); + const handle = toSyncResource(resourceKey, ref).toString(); return { - handle: resourceUri.toString(), + handle, collapsibleState: TreeItemCollapsibleState.None, label: { label: ref }, - command: { id: 'workbench.actions.openRef', title: '', arguments: [resourceUri] }, + command: { id: 'workbench.actions.sync.resolveResourceRef', title: '', arguments: [{ $treeItemHandle: handle, $treeViewId: '' }] }, themeIcon: FileThemeIcon, contextValue: `syncref-${resourceKey}` };