From 8e5752ba70bc1bf78f272205aa08030236056f9d Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 21 Jan 2020 04:27:46 +0100 Subject: [PATCH] auto comtinue sync if there are no conflicts --- .../userDataSync/common/settingsMerge.ts | 9 +++--- .../userDataSync/browser/userDataSync.ts | 32 +++++++++++++++++-- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/vs/platform/userDataSync/common/settingsMerge.ts b/src/vs/platform/userDataSync/common/settingsMerge.ts index 5295ec62918..08d3bf185aa 100644 --- a/src/vs/platform/userDataSync/common/settingsMerge.ts +++ b/src/vs/platform/userDataSync/common/settingsMerge.ts @@ -188,19 +188,20 @@ export function merge(originalLocalContent: string, originalRemoteContent: strin } } - const hasConflicts = conflicts.size > 0 || !areSame(localContent, remoteContent, ignored); - const hasLocalChanged = hasConflicts || !areSame(localContent, originalLocalContent, new Set()); - const hasRemoteChanged = hasConflicts || !areSame(remoteContent, originalRemoteContent, new Set()); + const hasConflicts = conflicts.size > 0 || !areSame(localContent, remoteContent, ignoredSettings); + const hasLocalChanged = hasConflicts || !areSame(localContent, originalLocalContent, []); + const hasRemoteChanged = hasConflicts || !areSame(remoteContent, originalRemoteContent, []); return { localContent: hasLocalChanged ? localContent : null, remoteContent: hasRemoteChanged ? remoteContent : null, conflictsSettings: values(conflicts), hasConflicts }; } -function areSame(localContent: string, remoteContent: string, ignored: Set): boolean { +export function areSame(localContent: string, remoteContent: string, ignoredSettings: string[]): boolean { if (localContent === remoteContent) { return true; } const local = parse(localContent); const remote = parse(remoteContent); + const ignored = ignoredSettings.reduce((set, key) => { set.add(key); return set; }, new Set()); const localTree = parseSettings(localContent).filter(node => !(node.setting && ignored.has(node.setting.key))); const remoteTree = parseSettings(remoteContent).filter(node => !(node.setting && ignored.has(node.setting.key))); diff --git a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts index d9ec444cba5..e3a0434dfa7 100644 --- a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts +++ b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts @@ -45,6 +45,8 @@ import { FloatingClickWidget } from 'vs/workbench/browser/parts/editor/editorWid import { IFileService } from 'vs/platform/files/common/files'; import { VSBuffer } from 'vs/base/common/buffer'; import { registerEditorContribution } from 'vs/editor/browser/editorExtensions'; +import { areSame } from 'vs/platform/userDataSync/common/settingsMerge'; +import { getIgnoredSettings } from 'vs/platform/userDataSync/common/settingsSync'; const enum AuthStatus { Initializing = 'Initializing', @@ -83,7 +85,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo @IOutputService private readonly outputService: IOutputService, @IUserDataAuthTokenService private readonly userDataAuthTokenService: IUserDataAuthTokenService, @IUserDataAutoSyncService userDataAutoSyncService: IUserDataAutoSyncService, - @ITextModelService textModelResolverService: ITextModelService, + @ITextModelService private readonly textModelResolverService: ITextModelService, ) { super(); this.userDataSyncStore = getUserDataSyncStore(configurationService); @@ -461,8 +463,9 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo label = localize('keybindings conflicts preview', "Keybindings Conflicts (Remote ↔ Local)"); } if (rightResource) { - await this.editorService.openEditor({ - leftResource: toRemoteContentResource(this.userDataSyncService.conflictsSource!), + const leftResource = toRemoteContentResource(this.userDataSyncService.conflictsSource!); + const editor = await this.editorService.openEditor({ + leftResource, rightResource, label, options: { @@ -471,6 +474,29 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo revealIfVisible: true, }, }); + if (editor?.input) { + const disposable = editor.input.onDispose(async () => { + disposable.dispose(); + this.checkAndContinueSync(leftResource, rightResource!); + }); + } + } + } + + private async checkAndContinueSync(remoteResource: URI, previewResource: URI): Promise { + const source = getSyncSourceFromRemoteContentResource(remoteResource); + if (source === undefined || this.userDataSyncService.conflictsSource !== source) { + return; + } + + const remoteModelRef = await this.textModelResolverService.createModelReference(remoteResource); + const previewModelRef = await this.textModelResolverService.createModelReference(previewResource!); + if (source === SyncSource.Settings) { + if (areSame(remoteModelRef.object.textEditorModel.getValue(), previewModelRef.object.textEditorModel.getValue(), getIgnoredSettings(this.configurationService))) { + await this.userDataSyncService.sync(true); + } + } else if (remoteModelRef.object.textEditorModel.getValue() === previewModelRef.object.textEditorModel.getValue()) { + await this.userDataSyncService.sync(true); } } -- GitLab