mirror of
https://github.com/microsoft/vscode.git
synced 2026-04-26 19:44:25 +01:00
Fix #103998
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { IUserDataSyncService, IAuthenticationProvider, isAuthenticationProvider, IUserDataAutoSyncService, SyncResource, IResourcePreview, ISyncResourcePreview, Change, IManualSyncTask, IUserDataSyncStoreManagementService, UserDataSyncStoreType } from 'vs/platform/userDataSync/common/userDataSync';
|
||||
import { IUserDataSyncService, IAuthenticationProvider, isAuthenticationProvider, IUserDataAutoSyncService, SyncResource, IResourcePreview, ISyncResourcePreview, Change, IManualSyncTask, IUserDataSyncStoreManagementService, UserDataSyncStoreType, SyncStatus } from 'vs/platform/userDataSync/common/userDataSync';
|
||||
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||
import { registerSingleton } from 'vs/platform/instantiation/common/extensions';
|
||||
import { IUserDataSyncWorkbenchService, IUserDataSyncAccount, AccountStatus, CONTEXT_SYNC_ENABLEMENT, CONTEXT_SYNC_STATE, CONTEXT_ACCOUNT_STATE, SHOW_SYNC_LOG_COMMAND_ID, getSyncAreaLabel, IUserDataSyncPreview, IUserDataSyncResource, CONTEXT_ENABLE_SYNC_MERGES_VIEW, SYNC_MERGES_VIEW_ID, CONTEXT_ENABLE_ACTIVITY_VIEWS, SYNC_VIEW_CONTAINER_ID, SYNC_TITLE } from 'vs/workbench/services/userDataSync/common/userDataSync';
|
||||
@@ -268,7 +268,6 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat
|
||||
const manualSyncTask = await this.userDataSyncService.createManualSyncTask();
|
||||
try {
|
||||
let action: FirstTimeSyncAction = 'manual';
|
||||
let preview: [SyncResource, ISyncResourcePreview][] = [];
|
||||
|
||||
await this.progressService.withProgress({
|
||||
location: ProgressLocation.Notification,
|
||||
@@ -277,7 +276,7 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat
|
||||
}, async progress => {
|
||||
progress.report({ message: localize('turning on', "Turning on...") });
|
||||
|
||||
preview = await manualSyncTask.preview();
|
||||
const preview = await manualSyncTask.preview();
|
||||
const hasRemoteData = manualSyncTask.manifest !== null;
|
||||
const hasLocalData = await this.userDataSyncService.hasLocalData();
|
||||
const hasMergesFromAnotherMachine = preview.some(([syncResource, { isLastSyncFromCurrentMachine, resourcePreviews }]) =>
|
||||
@@ -289,7 +288,12 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat
|
||||
synchronizingResources.length ? progress.report({ message: localize('syncing resource', "Syncing {0}...", getSyncAreaLabel(synchronizingResources[0][0])) }) : undefined);
|
||||
try {
|
||||
switch (action) {
|
||||
case 'merge': return await manualSyncTask.apply();
|
||||
case 'merge':
|
||||
await manualSyncTask.merge();
|
||||
if (manualSyncTask.status !== SyncStatus.HasConflicts) {
|
||||
await manualSyncTask.apply();
|
||||
}
|
||||
return;
|
||||
case 'pull': return await manualSyncTask.pull();
|
||||
case 'push': return await manualSyncTask.push();
|
||||
case 'manual': return;
|
||||
@@ -298,8 +302,15 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat
|
||||
progressDisposable.dispose();
|
||||
}
|
||||
});
|
||||
if (manualSyncTask.status === SyncStatus.HasConflicts) {
|
||||
await this.dialogService.show(Severity.Warning, localize('conflicts detected', "Conflicts Detected"), [], {
|
||||
detail: localize('resolve', "Unable to merge due to conflicts. Please resolve them to continue.")
|
||||
});
|
||||
await manualSyncTask.discardConflicts();
|
||||
action = 'manual';
|
||||
}
|
||||
if (action === 'manual') {
|
||||
await this.syncManually(manualSyncTask, preview);
|
||||
await this.syncManually(manualSyncTask);
|
||||
}
|
||||
} catch (error) {
|
||||
await manualSyncTask.stop();
|
||||
@@ -347,8 +358,9 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat
|
||||
throw canceled();
|
||||
}
|
||||
|
||||
private async syncManually(task: IManualSyncTask, preview: [SyncResource, ISyncResourcePreview][]): Promise<void> {
|
||||
private async syncManually(task: IManualSyncTask): Promise<void> {
|
||||
const visibleViewContainer = this.viewsService.getVisibleViewContainer(ViewContainerLocation.Sidebar);
|
||||
const preview = await task.preview();
|
||||
this.userDataSyncPreview.setManualSyncPreview(task, preview);
|
||||
|
||||
this.mergesViewEnablementContext.set(true);
|
||||
|
||||
@@ -73,8 +73,8 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ
|
||||
}
|
||||
|
||||
async createManualSyncTask(): Promise<IManualSyncTask> {
|
||||
const { id, manifest } = await this.channel.call<{ id: string, manifest: IUserDataManifest | null }>('createManualSyncTask');
|
||||
return new ManualSyncTask(id, manifest, this.sharedProcessService);
|
||||
const { id, manifest, status } = await this.channel.call<{ id: string, manifest: IUserDataManifest | null, status: SyncStatus }>('createManualSyncTask');
|
||||
return new ManualSyncTask(id, manifest, status, this.sharedProcessService);
|
||||
}
|
||||
|
||||
replace(uri: URI): Promise<void> {
|
||||
@@ -163,16 +163,27 @@ class ManualSyncTask implements IManualSyncTask {
|
||||
|
||||
get onSynchronizeResources(): Event<[SyncResource, URI[]][]> { return this.channel.listen<[SyncResource, URI[]][]>('onSynchronizeResources'); }
|
||||
|
||||
private _status: SyncStatus;
|
||||
get status(): SyncStatus { return this._status; }
|
||||
|
||||
constructor(
|
||||
readonly id: string,
|
||||
readonly manifest: IUserDataManifest | null,
|
||||
status: SyncStatus,
|
||||
sharedProcessService: ISharedProcessService,
|
||||
) {
|
||||
const manualSyncTaskChannel = sharedProcessService.getChannel(`manualSyncTask-${id}`);
|
||||
this._status = status;
|
||||
const that = this;
|
||||
this.channel = {
|
||||
call<T>(command: string, arg?: any, cancellationToken?: CancellationToken): Promise<T> {
|
||||
return manualSyncTaskChannel.call(command, arg, cancellationToken)
|
||||
.then(null, error => { throw UserDataSyncError.toUserDataSyncError(error); });
|
||||
async call<T>(command: string, arg?: any, cancellationToken?: CancellationToken): Promise<T> {
|
||||
try {
|
||||
const result = await manualSyncTaskChannel.call<T>(command, arg, cancellationToken);
|
||||
that._status = await manualSyncTaskChannel.call<SyncStatus>('_getStatus');
|
||||
return result;
|
||||
} catch (error) {
|
||||
throw UserDataSyncError.toUserDataSyncError(error);
|
||||
}
|
||||
},
|
||||
listen<T>(event: string, arg?: any): Event<T> {
|
||||
return manualSyncTaskChannel.listen(event, arg);
|
||||
@@ -190,7 +201,7 @@ class ManualSyncTask implements IManualSyncTask {
|
||||
return this.deserializePreviews(previews);
|
||||
}
|
||||
|
||||
async merge(resource: URI): Promise<[SyncResource, ISyncResourcePreview][]> {
|
||||
async merge(resource?: URI): Promise<[SyncResource, ISyncResourcePreview][]> {
|
||||
const previews = await this.channel.call<[SyncResource, ISyncResourcePreview][]>('merge', [resource]);
|
||||
return this.deserializePreviews(previews);
|
||||
}
|
||||
@@ -200,6 +211,11 @@ class ManualSyncTask implements IManualSyncTask {
|
||||
return this.deserializePreviews(previews);
|
||||
}
|
||||
|
||||
async discardConflicts(): Promise<[SyncResource, ISyncResourcePreview][]> {
|
||||
const previews = await this.channel.call<[SyncResource, ISyncResourcePreview][]>('discardConflicts');
|
||||
return this.deserializePreviews(previews);
|
||||
}
|
||||
|
||||
async apply(): Promise<[SyncResource, ISyncResourcePreview][]> {
|
||||
const previews = await this.channel.call<[SyncResource, ISyncResourcePreview][]>('apply');
|
||||
return this.deserializePreviews(previews);
|
||||
|
||||
Reference in New Issue
Block a user