Skip to content

Commit 8e5752b

Browse files
committed
auto comtinue sync if there are no conflicts
1 parent d4dfc8b commit 8e5752b

2 files changed

Lines changed: 34 additions & 7 deletions

File tree

src/vs/platform/userDataSync/common/settingsMerge.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,19 +188,20 @@ export function merge(originalLocalContent: string, originalRemoteContent: strin
188188
}
189189
}
190190

191-
const hasConflicts = conflicts.size > 0 || !areSame(localContent, remoteContent, ignored);
192-
const hasLocalChanged = hasConflicts || !areSame(localContent, originalLocalContent, new Set<string>());
193-
const hasRemoteChanged = hasConflicts || !areSame(remoteContent, originalRemoteContent, new Set<string>());
191+
const hasConflicts = conflicts.size > 0 || !areSame(localContent, remoteContent, ignoredSettings);
192+
const hasLocalChanged = hasConflicts || !areSame(localContent, originalLocalContent, []);
193+
const hasRemoteChanged = hasConflicts || !areSame(remoteContent, originalRemoteContent, []);
194194
return { localContent: hasLocalChanged ? localContent : null, remoteContent: hasRemoteChanged ? remoteContent : null, conflictsSettings: values(conflicts), hasConflicts };
195195
}
196196

197-
function areSame(localContent: string, remoteContent: string, ignored: Set<string>): boolean {
197+
export function areSame(localContent: string, remoteContent: string, ignoredSettings: string[]): boolean {
198198
if (localContent === remoteContent) {
199199
return true;
200200
}
201201

202202
const local = parse(localContent);
203203
const remote = parse(remoteContent);
204+
const ignored = ignoredSettings.reduce((set, key) => { set.add(key); return set; }, new Set<string>());
204205
const localTree = parseSettings(localContent).filter(node => !(node.setting && ignored.has(node.setting.key)));
205206
const remoteTree = parseSettings(remoteContent).filter(node => !(node.setting && ignored.has(node.setting.key)));
206207

src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ import { FloatingClickWidget } from 'vs/workbench/browser/parts/editor/editorWid
4545
import { IFileService } from 'vs/platform/files/common/files';
4646
import { VSBuffer } from 'vs/base/common/buffer';
4747
import { registerEditorContribution } from 'vs/editor/browser/editorExtensions';
48+
import { areSame } from 'vs/platform/userDataSync/common/settingsMerge';
49+
import { getIgnoredSettings } from 'vs/platform/userDataSync/common/settingsSync';
4850

4951
const enum AuthStatus {
5052
Initializing = 'Initializing',
@@ -83,7 +85,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo
8385
@IOutputService private readonly outputService: IOutputService,
8486
@IUserDataAuthTokenService private readonly userDataAuthTokenService: IUserDataAuthTokenService,
8587
@IUserDataAutoSyncService userDataAutoSyncService: IUserDataAutoSyncService,
86-
@ITextModelService textModelResolverService: ITextModelService,
88+
@ITextModelService private readonly textModelResolverService: ITextModelService,
8789
) {
8890
super();
8991
this.userDataSyncStore = getUserDataSyncStore(configurationService);
@@ -461,8 +463,9 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo
461463
label = localize('keybindings conflicts preview', "Keybindings Conflicts (Remote ↔ Local)");
462464
}
463465
if (rightResource) {
464-
await this.editorService.openEditor({
465-
leftResource: toRemoteContentResource(this.userDataSyncService.conflictsSource!),
466+
const leftResource = toRemoteContentResource(this.userDataSyncService.conflictsSource!);
467+
const editor = await this.editorService.openEditor({
468+
leftResource,
466469
rightResource,
467470
label,
468471
options: {
@@ -471,6 +474,29 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo
471474
revealIfVisible: true,
472475
},
473476
});
477+
if (editor?.input) {
478+
const disposable = editor.input.onDispose(async () => {
479+
disposable.dispose();
480+
this.checkAndContinueSync(leftResource, rightResource!);
481+
});
482+
}
483+
}
484+
}
485+
486+
private async checkAndContinueSync(remoteResource: URI, previewResource: URI): Promise<void> {
487+
const source = getSyncSourceFromRemoteContentResource(remoteResource);
488+
if (source === undefined || this.userDataSyncService.conflictsSource !== source) {
489+
return;
490+
}
491+
492+
const remoteModelRef = await this.textModelResolverService.createModelReference(remoteResource);
493+
const previewModelRef = await this.textModelResolverService.createModelReference(previewResource!);
494+
if (source === SyncSource.Settings) {
495+
if (areSame(remoteModelRef.object.textEditorModel.getValue(), previewModelRef.object.textEditorModel.getValue(), getIgnoredSettings(this.configurationService))) {
496+
await this.userDataSyncService.sync(true);
497+
}
498+
} else if (remoteModelRef.object.textEditorModel.getValue() === previewModelRef.object.textEditorModel.getValue()) {
499+
await this.userDataSyncService.sync(true);
474500
}
475501
}
476502

0 commit comments

Comments
 (0)