mirror of
https://github.com/microsoft/vscode.git
synced 2026-07-09 19:41:08 -05:00
Fix #103005
This commit is contained in:
@@ -384,7 +384,7 @@ export abstract class AbstractSynchroniser extends Disposable {
|
||||
}
|
||||
}
|
||||
|
||||
async accept(resource: URI, content: string): Promise<ISyncResourcePreview | null> {
|
||||
async accept(resource: URI, content: string | null): Promise<ISyncResourcePreview | null> {
|
||||
await this.updateSyncResourcePreview(resource, async (resourcePreview) => {
|
||||
const updatedResourcePreview = await this.updateResourcePreview(resourcePreview, resource, content);
|
||||
return {
|
||||
@@ -397,7 +397,7 @@ export abstract class AbstractSynchroniser extends Disposable {
|
||||
|
||||
async merge(resource: URI): Promise<ISyncResourcePreview | null> {
|
||||
await this.updateSyncResourcePreview(resource, async (resourcePreview) => {
|
||||
const updatedResourcePreview = await this.updateResourcePreview(resourcePreview, resourcePreview.previewResource, resourcePreview.previewContent || '');
|
||||
const updatedResourcePreview = await this.updateResourcePreview(resourcePreview, resourcePreview.previewResource, resourcePreview.previewContent);
|
||||
return {
|
||||
...updatedResourcePreview,
|
||||
mergeState: resourcePreview.hasConflicts ? MergeState.Conflict : MergeState.Accepted
|
||||
@@ -409,7 +409,7 @@ export abstract class AbstractSynchroniser extends Disposable {
|
||||
async discard(resource: URI): Promise<ISyncResourcePreview | null> {
|
||||
await this.updateSyncResourcePreview(resource, async (resourcePreview) => {
|
||||
await this.fileService.writeFile(resourcePreview.previewResource, VSBuffer.fromString(resourcePreview.previewContent || ''));
|
||||
const updatedResourcePreview = await this.updateResourcePreview(resourcePreview, resourcePreview.previewResource, resourcePreview.previewContent || '');
|
||||
const updatedResourcePreview = await this.updateResourcePreview(resourcePreview, resourcePreview.previewResource, resourcePreview.previewContent);
|
||||
return {
|
||||
...updatedResourcePreview,
|
||||
mergeState: MergeState.Preview
|
||||
@@ -448,7 +448,7 @@ export abstract class AbstractSynchroniser extends Disposable {
|
||||
}
|
||||
}
|
||||
|
||||
protected async updateResourcePreview(resourcePreview: IResourcePreview, resource: URI, acceptedContent: string): Promise<IResourcePreview> {
|
||||
protected async updateResourcePreview(resourcePreview: IResourcePreview, resource: URI, acceptedContent: string | null): Promise<IResourcePreview> {
|
||||
return {
|
||||
...resourcePreview,
|
||||
acceptedContent
|
||||
@@ -550,13 +550,13 @@ export abstract class AbstractSynchroniser extends Disposable {
|
||||
if (syncPreview) {
|
||||
for (const resourcePreview of syncPreview.resourcePreviews) {
|
||||
if (isEqual(resourcePreview.acceptedResource, uri)) {
|
||||
return resourcePreview.acceptedContent || '';
|
||||
return resourcePreview.acceptedContent;
|
||||
}
|
||||
if (isEqual(resourcePreview.remoteResource, uri)) {
|
||||
return resourcePreview.remoteContent || '';
|
||||
return resourcePreview.remoteContent;
|
||||
}
|
||||
if (isEqual(resourcePreview.localResource, uri)) {
|
||||
return resourcePreview.localContent || '';
|
||||
return resourcePreview.localContent;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -183,7 +183,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse
|
||||
}
|
||||
}
|
||||
|
||||
protected async updateResourcePreview(resourcePreview: IExtensionResourcePreview, resource: URI, acceptedContent: string): Promise<IExtensionResourcePreview> {
|
||||
protected async updateResourcePreview(resourcePreview: IExtensionResourcePreview, resource: URI, acceptedContent: string | null): Promise<IExtensionResourcePreview> {
|
||||
if (isEqual(resource, this.localResource)) {
|
||||
const remoteExtensions = resourcePreview.remoteContent ? JSON.parse(resourcePreview.remoteContent) : null;
|
||||
return this.getPushPreview(remoteExtensions);
|
||||
|
||||
@@ -178,7 +178,7 @@ export class GlobalStateSynchroniser extends AbstractSynchroniser implements IUs
|
||||
}
|
||||
}
|
||||
|
||||
protected async updateResourcePreview(resourcePreview: IGlobalStateResourcePreview, resource: URI, acceptedContent: string): Promise<IGlobalStateResourcePreview> {
|
||||
protected async updateResourcePreview(resourcePreview: IGlobalStateResourcePreview, resource: URI, acceptedContent: string | null): Promise<IGlobalStateResourcePreview> {
|
||||
if (isEqual(this.localResource, resource)) {
|
||||
return this.getPushPreview(resourcePreview.remoteContent);
|
||||
}
|
||||
|
||||
@@ -199,8 +199,8 @@ export class SettingsSynchroniser extends AbstractJsonFileSynchroniser implement
|
||||
}];
|
||||
}
|
||||
|
||||
protected async updateResourcePreview(resourcePreview: IFileResourcePreview, resource: URI, acceptedContent: string): Promise<IFileResourcePreview> {
|
||||
if (acceptedContent && isEqual(resource, this.previewResource) || isEqual(resource, this.remoteResource)) {
|
||||
protected async updateResourcePreview(resourcePreview: IFileResourcePreview, resource: URI, acceptedContent: string | null): Promise<IFileResourcePreview> {
|
||||
if (acceptedContent && (isEqual(resource, this.previewResource) || isEqual(resource, this.remoteResource))) {
|
||||
const formatUtils = await this.getFormattingOptions();
|
||||
// Add ignored settings from local file content
|
||||
const ignoredSettings = await this.getIgnoredSettings();
|
||||
|
||||
@@ -96,12 +96,12 @@ export class SnippetsSynchroniser extends AbstractSynchroniser implements IUserD
|
||||
return this.getResourcePreviews(mergeResult, local, remoteSnippets || {});
|
||||
}
|
||||
|
||||
protected async updateResourcePreview(resourcePreview: IFileResourcePreview, resource: URI, acceptedContent: string): Promise<IFileResourcePreview> {
|
||||
protected async updateResourcePreview(resourcePreview: IFileResourcePreview, resource: URI, acceptedContent: string | null): Promise<IFileResourcePreview> {
|
||||
return {
|
||||
...resourcePreview,
|
||||
acceptedContent: acceptedContent || null,
|
||||
localChange: this.computeLocalChange(resourcePreview, resource, acceptedContent || null),
|
||||
remoteChange: this.computeRemoteChange(resourcePreview, resource, acceptedContent || null),
|
||||
acceptedContent,
|
||||
localChange: this.computeLocalChange(resourcePreview, resource, acceptedContent),
|
||||
remoteChange: this.computeRemoteChange(resourcePreview, resource, acceptedContent),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -360,7 +360,7 @@ export interface IUserDataSynchroniser {
|
||||
stop(): Promise<void>;
|
||||
|
||||
preview(manifest: IUserDataManifest | null, headers: IHeaders): Promise<ISyncResourcePreview | null>;
|
||||
accept(resource: URI, content: string): Promise<ISyncResourcePreview | null>;
|
||||
accept(resource: URI, content: string | null): Promise<ISyncResourcePreview | null>;
|
||||
merge(resource: URI): Promise<ISyncResourcePreview | null>;
|
||||
discard(resource: URI): Promise<ISyncResourcePreview | null>;
|
||||
apply(force: boolean, headers: IHeaders): Promise<ISyncResourcePreview | null>;
|
||||
@@ -400,7 +400,7 @@ export interface IManualSyncTask extends IDisposable {
|
||||
readonly manifest: IUserDataManifest | null;
|
||||
readonly onSynchronizeResources: Event<[SyncResource, URI[]][]>;
|
||||
preview(): Promise<[SyncResource, ISyncResourcePreview][]>;
|
||||
accept(resource: URI, content: string): Promise<[SyncResource, ISyncResourcePreview][]>;
|
||||
accept(resource: URI, content: string | null): Promise<[SyncResource, ISyncResourcePreview][]>;
|
||||
merge(resource: URI): Promise<[SyncResource, ISyncResourcePreview][]>;
|
||||
discard(resource: URI): Promise<[SyncResource, ISyncResourcePreview][]>;
|
||||
apply(): Promise<[SyncResource, ISyncResourcePreview][]>;
|
||||
@@ -437,7 +437,7 @@ export interface IUserDataSyncService {
|
||||
hasLocalData(): Promise<boolean>;
|
||||
hasPreviouslySynced(): Promise<boolean>;
|
||||
resolveContent(resource: URI): Promise<string | null>;
|
||||
accept(resource: SyncResource, conflictResource: URI, content: string, apply: boolean): Promise<void>;
|
||||
accept(resource: SyncResource, conflictResource: URI, content: string | null, apply: boolean): Promise<void>;
|
||||
|
||||
getLocalSyncResourceHandles(resource: SyncResource): Promise<ISyncResourceHandle[]>;
|
||||
getRemoteSyncResourceHandles(resource: SyncResource): Promise<ISyncResourceHandle[]>;
|
||||
|
||||
@@ -65,7 +65,7 @@ export class UserDataSyncChannel implements IServerChannel {
|
||||
|
||||
private async createManualSyncTask(): Promise<{ id: string, manifest: IUserDataManifest | null }> {
|
||||
const manualSyncTask = await this.service.createManualSyncTask();
|
||||
const manualSyncTaskChannel = new ManualSyncTaskChannel(manualSyncTask);
|
||||
const manualSyncTaskChannel = new ManualSyncTaskChannel(manualSyncTask, this.logService);
|
||||
this.server.registerChannel(`manualSyncTask-${manualSyncTask.id}`, manualSyncTaskChannel);
|
||||
return { id: manualSyncTask.id, manifest: manualSyncTask.manifest };
|
||||
}
|
||||
@@ -73,7 +73,10 @@ export class UserDataSyncChannel implements IServerChannel {
|
||||
|
||||
class ManualSyncTaskChannel implements IServerChannel {
|
||||
|
||||
constructor(private readonly manualSyncTask: IManualSyncTask) { }
|
||||
constructor(
|
||||
private readonly manualSyncTask: IManualSyncTask,
|
||||
private readonly logService: ILogService
|
||||
) { }
|
||||
|
||||
listen(_: unknown, event: string): Event<any> {
|
||||
switch (event) {
|
||||
@@ -83,6 +86,16 @@ class ManualSyncTaskChannel implements IServerChannel {
|
||||
}
|
||||
|
||||
async call(context: any, command: string, args?: any): Promise<any> {
|
||||
try {
|
||||
const result = await this._call(context, command, args);
|
||||
return result;
|
||||
} catch (e) {
|
||||
this.logService.error(e);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
private async _call(context: any, command: string, args?: any): Promise<any> {
|
||||
switch (command) {
|
||||
case 'preview': return this.manualSyncTask.preview();
|
||||
case 'accept': return this.manualSyncTask.accept(URI.revive(args[0]), args[1]);
|
||||
|
||||
@@ -256,7 +256,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ
|
||||
}
|
||||
}
|
||||
|
||||
async accept(syncResource: SyncResource, resource: URI, content: string, apply: boolean): Promise<void> {
|
||||
async accept(syncResource: SyncResource, resource: URI, content: string | null, apply: boolean): Promise<void> {
|
||||
await this.checkEnablement();
|
||||
const synchroniser = this.getSynchroniser(syncResource);
|
||||
await synchroniser.accept(resource, content);
|
||||
@@ -456,7 +456,7 @@ class ManualSyncTask extends Disposable implements IManualSyncTask {
|
||||
return this.previews;
|
||||
}
|
||||
|
||||
async accept(resource: URI, content: string): Promise<[SyncResource, ISyncResourcePreview][]> {
|
||||
async accept(resource: URI, content: string | null): Promise<[SyncResource, ISyncResourcePreview][]> {
|
||||
return this.performAction(resource, sychronizer => sychronizer.accept(resource, content));
|
||||
}
|
||||
|
||||
@@ -555,7 +555,7 @@ class ManualSyncTask extends Disposable implements IManualSyncTask {
|
||||
this._onSynchronizeResources.fire(this.synchronizingResources);
|
||||
const synchroniser = this.synchronisers.find(s => s.resource === syncResource)!;
|
||||
for (const resourcePreview of preview.resourcePreviews) {
|
||||
const content = await synchroniser.resolveContent(resourcePreview.remoteResource) || '';
|
||||
const content = await synchroniser.resolveContent(resourcePreview.remoteResource);
|
||||
await synchroniser.accept(resourcePreview.remoteResource, content);
|
||||
}
|
||||
await synchroniser.apply(true, this.syncHeaders);
|
||||
@@ -577,7 +577,7 @@ class ManualSyncTask extends Disposable implements IManualSyncTask {
|
||||
this._onSynchronizeResources.fire(this.synchronizingResources);
|
||||
const synchroniser = this.synchronisers.find(s => s.resource === syncResource)!;
|
||||
for (const resourcePreview of preview.resourcePreviews) {
|
||||
const content = await synchroniser.resolveContent(resourcePreview.localResource) || '';
|
||||
const content = await synchroniser.resolveContent(resourcePreview.localResource);
|
||||
await synchroniser.accept(resourcePreview.localResource, content);
|
||||
}
|
||||
await synchroniser.apply(true, this.syncHeaders);
|
||||
|
||||
@@ -83,4 +83,20 @@ suite('KeybindingsSync', () => {
|
||||
assert.equal(testObject.getKeybindingsContentFromSyncContent(lastSyncUserData!.syncData!.content!), '[]');
|
||||
});
|
||||
|
||||
test('test apply remote when keybindings file does not exist', async () => {
|
||||
const fileService = client.instantiationService.get(IFileService);
|
||||
const keybindingsResource = client.instantiationService.get(IEnvironmentService).keybindingsResource;
|
||||
if (await fileService.exists(keybindingsResource)) {
|
||||
await fileService.del(keybindingsResource);
|
||||
}
|
||||
|
||||
const preview = (await testObject.preview(await client.manifest()))!;
|
||||
|
||||
server.reset();
|
||||
const content = await testObject.resolveContent(preview.resourcePreviews[0].remoteResource);
|
||||
await testObject.accept(preview.resourcePreviews[0].remoteResource, content);
|
||||
await testObject.apply(false);
|
||||
assert.deepEqual(server.requests, []);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
@@ -252,7 +252,7 @@ export class UserDataManualSyncViewPane extends TreeViewPane {
|
||||
private async acceptLocal(userDataSyncResource: IUserDataSyncResource): Promise<void> {
|
||||
await this.withProgress(async () => {
|
||||
const content = await this.userDataSyncService.resolveContent(userDataSyncResource.local);
|
||||
await this.userDataSyncPreview.accept(userDataSyncResource.syncResource, userDataSyncResource.local, content || '');
|
||||
await this.userDataSyncPreview.accept(userDataSyncResource.syncResource, userDataSyncResource.local, content);
|
||||
});
|
||||
await this.reopen(userDataSyncResource);
|
||||
}
|
||||
@@ -260,7 +260,7 @@ export class UserDataManualSyncViewPane extends TreeViewPane {
|
||||
private async acceptRemote(userDataSyncResource: IUserDataSyncResource): Promise<void> {
|
||||
await this.withProgress(async () => {
|
||||
const content = await this.userDataSyncService.resolveContent(userDataSyncResource.remote);
|
||||
await this.userDataSyncPreview.accept(userDataSyncResource.syncResource, userDataSyncResource.remote, content || '');
|
||||
await this.userDataSyncPreview.accept(userDataSyncResource.syncResource, userDataSyncResource.remote, content);
|
||||
});
|
||||
await this.reopen(userDataSyncResource);
|
||||
}
|
||||
|
||||
@@ -593,7 +593,7 @@ class UserDataSyncPreview extends Disposable implements IUserDataSyncPreview {
|
||||
this.updateResources();
|
||||
}
|
||||
|
||||
async accept(syncResource: SyncResource, resource: URI, content: string): Promise<void> {
|
||||
async accept(syncResource: SyncResource, resource: URI, content: string | null): Promise<void> {
|
||||
if (this.manualSync) {
|
||||
const syncPreview = await this.manualSync.task.accept(resource, content);
|
||||
this.updatePreview(syncPreview);
|
||||
|
||||
@@ -20,7 +20,7 @@ export interface IUserDataSyncPreview {
|
||||
readonly onDidChangeResources: Event<ReadonlyArray<IUserDataSyncResource>>;
|
||||
readonly resources: ReadonlyArray<IUserDataSyncResource>;
|
||||
|
||||
accept(syncResource: SyncResource, resource: URI, content: string): Promise<void>;
|
||||
accept(syncResource: SyncResource, resource: URI, content: string | null): Promise<void>;
|
||||
merge(resource?: URI): Promise<void>;
|
||||
discard(resource?: URI): Promise<void>;
|
||||
pull(): Promise<void>;
|
||||
|
||||
@@ -102,7 +102,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ
|
||||
return this.channel.call('hasLocalData');
|
||||
}
|
||||
|
||||
accept(syncResource: SyncResource, resource: URI, content: string, apply: boolean): Promise<void> {
|
||||
accept(syncResource: SyncResource, resource: URI, content: string | null, apply: boolean): Promise<void> {
|
||||
return this.channel.call('accept', [syncResource, resource, content, apply]);
|
||||
}
|
||||
|
||||
@@ -186,7 +186,7 @@ class ManualSyncTask implements IManualSyncTask {
|
||||
return this.deserializePreviews(previews);
|
||||
}
|
||||
|
||||
async accept(resource: URI, content: string): Promise<[SyncResource, ISyncResourcePreview][]> {
|
||||
async accept(resource: URI, content: string | null): Promise<[SyncResource, ISyncResourcePreview][]> {
|
||||
const previews = await this.channel.call<[SyncResource, ISyncResourcePreview][]>('accept', [resource, content]);
|
||||
return this.deserializePreviews(previews);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user