From e69a8a6a45c5757aeddebeecc5e74901847fc3b9 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 21 Jan 2020 01:59:12 +0100 Subject: [PATCH] fix handling conflicts --- .../browser/userDataRemoteContentProvider.ts | 39 ---------- .../browser/userDataSync.contribution.ts | 2 - .../userDataSync/browser/userDataSync.ts | 77 ++++++++++++++----- 3 files changed, 58 insertions(+), 60 deletions(-) delete mode 100644 src/vs/workbench/contrib/userDataSync/browser/userDataRemoteContentProvider.ts diff --git a/src/vs/workbench/contrib/userDataSync/browser/userDataRemoteContentProvider.ts b/src/vs/workbench/contrib/userDataSync/browser/userDataRemoteContentProvider.ts deleted file mode 100644 index 88eadbd2ff5..00000000000 --- a/src/vs/workbench/contrib/userDataSync/browser/userDataRemoteContentProvider.ts +++ /dev/null @@ -1,39 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { ITextModelContentProvider, ITextModelService } from 'vs/editor/common/services/resolverService'; -import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import { ITextModel } from 'vs/editor/common/model'; -import { URI } from 'vs/base/common/uri'; -import { SyncSource, USER_DATA_SYNC_SCHEME, IUserDataSyncService } from 'vs/platform/userDataSync/common/userDataSync'; -import { IModelService } from 'vs/editor/common/services/modelService'; -import { IModeService } from 'vs/editor/common/services/modeService'; - -export class UserDataRemoteContentProvider implements ITextModelContentProvider, IWorkbenchContribution { - - constructor( - @ITextModelService private readonly textModelResolverService: ITextModelService, - @IUserDataSyncService private readonly userDataSyncService: IUserDataSyncService, - @IModelService private readonly modelService: IModelService, - @IModeService private readonly modeService: IModeService, - ) { - this.textModelResolverService.registerTextModelContentProvider(USER_DATA_SYNC_SCHEME, this); - } - - provideTextContent(uri: URI): Promise | null { - let promise: Promise | undefined; - if (uri.authority === SyncSource.Settings.toLowerCase()) { - promise = this.userDataSyncService.getRemoteContent(SyncSource.Settings); - } - if (uri.authority === SyncSource.Keybindings.toLowerCase()) { - promise = this.userDataSyncService.getRemoteContent(SyncSource.Keybindings); - } - if (promise) { - return promise.then(content => this.modelService.createModel(content || '', this.modeService.create('jsonc'), uri)); - } - return null; - } - -} diff --git a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.contribution.ts b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.contribution.ts index 9440b0c59e9..367dd0b6fb3 100644 --- a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.contribution.ts +++ b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.contribution.ts @@ -7,8 +7,6 @@ import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } fr import { Registry } from 'vs/platform/registry/common/platform'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { UserDataSyncWorkbenchContribution } from 'vs/workbench/contrib/userDataSync/browser/userDataSync'; -import { UserDataRemoteContentProvider } from 'vs/workbench/contrib/userDataSync/browser/userDataRemoteContentProvider'; const workbenchRegistry = Registry.as(WorkbenchExtensions.Workbench); workbenchRegistry.registerWorkbenchContribution(UserDataSyncWorkbenchContribution, LifecyclePhase.Ready); -workbenchRegistry.registerWorkbenchContribution(UserDataRemoteContentProvider, LifecyclePhase.Ready); diff --git a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts index 0f397651475..cc031b61757 100644 --- a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts +++ b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts @@ -36,6 +36,11 @@ import { IAuthenticationService } from 'vs/workbench/services/authentication/bro import { Session } from 'vs/editor/common/modes'; import { isPromiseCanceledError, canceled } from 'vs/base/common/errors'; import { toErrorMessage } from 'vs/base/common/errorMessage'; +import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; +import { ITextModelService, ITextModelContentProvider } from 'vs/editor/common/services/resolverService'; +import { IModelService } from 'vs/editor/common/services/modelService'; +import { IModeService } from 'vs/editor/common/services/modeService'; +import type { ITextModel } from 'vs/editor/common/model'; const enum AuthStatus { Initializing = 'Initializing', @@ -76,6 +81,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo @IOutputService private readonly outputService: IOutputService, @IUserDataAuthTokenService private readonly userDataAuthTokenService: IUserDataAuthTokenService, @IUserDataAutoSyncService userDataAutoSyncService: IUserDataAutoSyncService, + @ITextModelService textModelResolverService: ITextModelService, ) { super(); this.userDataSyncStore = getUserDataSyncStore(configurationService); @@ -97,6 +103,8 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo this._register(instantiationService.createInstance(UserDataSyncTrigger).onDidTriggerSync(() => userDataAutoSyncService.triggerAutoSync())); } }); + + textModelResolverService.registerTextModelContentProvider(USER_DATA_SYNC_SCHEME, instantiationService.createInstance(UserDataRemoteContentProvider)); } } @@ -200,7 +208,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo handle.onDidClose(() => this.conflictsWarningDisposable.clear()); } } else { - const previewEditorInput = this.getPreviewEditorInput(); + const previewEditorInput = this.getConflictsEditorInput(); if (previewEditorInput) { previewEditorInput.dispose(); } @@ -413,7 +421,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo private async continueSync(): Promise { // Get the preview editor - const previewEditorInput = this.getPreviewEditorInput(); + const previewEditorInput = this.getConflictsEditorInput(); // Save the preview if (previewEditorInput && previewEditorInput.isDirty()) { await this.textFileService.save(previewEditorInput.getResource()!); @@ -431,28 +439,34 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo } } - private getPreviewEditorInput(): IEditorInput | undefined { - return this.editorService.editors.filter(input => isEqual(input.getResource(), this.workbenchEnvironmentService.settingsSyncPreviewResource) || isEqual(input.getResource(), this.workbenchEnvironmentService.keybindingsSyncPreviewResource))[0]; - } - - private async openConflictsEditor(remoteResource: URI, previewResource: URI, source: SyncSource): Promise { - await this.editorService.openEditor({ - rightResource: previewResource, - leftResource: remoteResource, - label: localize('conflicts preview', "{0} Conflicts (Remote ↔ Local)", source), - options: { - preserveFocus: false, - pinned: false, - revealIfVisible: true, - }, - }); + private getConflictsEditorInput(): IEditorInput | undefined { + return this.editorService.editors.filter(input => { + const resource = input instanceof DiffEditorInput ? input.master.getResource() : input.getResource(); + return isEqual(resource, this.workbenchEnvironmentService.settingsSyncPreviewResource) || isEqual(resource, this.workbenchEnvironmentService.keybindingsSyncPreviewResource); + })[0]; } private async handleConflicts(): Promise { + let rightResource: URI | undefined = undefined; + let label: string = ''; if (this.userDataSyncService.conflictsSource === SyncSource.Settings) { - return this.openConflictsEditor(URI.from({ scheme: USER_DATA_SYNC_SCHEME, authority: this.userDataSyncService.conflictsSource, path: '/remoteContent' }), this.workbenchEnvironmentService.settingsSyncPreviewResource, this.userDataSyncService.conflictsSource); + rightResource = this.workbenchEnvironmentService.settingsSyncPreviewResource; + label = localize('settings conflicts preview', "Settings Conflicts (Remote ↔ Local)"); } else if (this.userDataSyncService.conflictsSource === SyncSource.Keybindings) { - return this.openConflictsEditor(URI.from({ scheme: USER_DATA_SYNC_SCHEME, authority: this.userDataSyncService.conflictsSource, path: '/remoteContent' }), this.workbenchEnvironmentService.keybindingsSyncPreviewResource, this.userDataSyncService.conflictsSource); + rightResource = this.workbenchEnvironmentService.keybindingsResource; + label = localize('keybindings conflicts preview', "Keybindings Conflicts (Remote ↔ Local)"); + } + if (rightResource) { + await this.editorService.openEditor({ + leftResource: URI.from({ scheme: USER_DATA_SYNC_SCHEME, path: `${this.userDataSyncService.conflictsSource}/remoteContent` }), + rightResource, + label, + options: { + preserveFocus: false, + pinned: false, + revealIfVisible: true, + }, + }); } } @@ -623,3 +637,28 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo }); } } + +class UserDataRemoteContentProvider implements ITextModelContentProvider { + + constructor( + @IUserDataSyncService private readonly userDataSyncService: IUserDataSyncService, + @IModelService private readonly modelService: IModelService, + @IModeService private readonly modeService: IModeService, + ) { + } + + provideTextContent(uri: URI): Promise | null { + let promise: Promise | undefined; + if (uri.path === `${SyncSource.Settings}/remoteContent`) { + promise = this.userDataSyncService.getRemoteContent(SyncSource.Settings); + } + if (uri.path === `${SyncSource.Keybindings}/remoteContent`) { + promise = this.userDataSyncService.getRemoteContent(SyncSource.Keybindings); + } + if (promise) { + return promise.then(content => this.modelService.createModel(content || '', this.modeService.create('jsonc'), uri)); + } + return null; + } +} +