提交 1eb2a37e 编写于 作者: S Sandeep Somavarapu

do not sync extension state when extension has not registered any keys to sync

上级 20601293
......@@ -74,10 +74,14 @@ export function merge(localExtensions: ISyncExtension[], remoteExtensions: ISync
const baseToRemote = compare(lastSyncExtensionsMap, remoteExtensionsMap, ignoredExtensionsSet);
const mergeAndUpdate = (key: string): void => {
const extension = remoteExtensionsMap.get(key)!;
extension.state = mergeExtensionState(localExtensionsMap.get(key)?.state, extension.state, lastSyncExtensionsMap?.get(key)?.state);
updated.push(massageOutgoingExtension(extension, key));
newRemoteExtensionsMap.set(key, extension);
const localExtension = localExtensionsMap.get(key)!;
const remoteExtension = remoteExtensionsMap.get(key)!;
// merge extension state only when version matches and local extension has state
if (remoteExtension.version === localExtension.version && localExtension.state) {
remoteExtension.state = mergeExtensionState(localExtension.state, remoteExtension.state, lastSyncExtensionsMap?.get(key)?.state);
}
updated.push(massageOutgoingExtension(remoteExtension, key));
newRemoteExtensionsMap.set(key, remoteExtension);
};
// Remotely removed extension.
......@@ -183,18 +187,7 @@ function compare(from: Map<string, ISyncExtension> | null, to: Map<string, ISync
return { added, removed, updated };
}
function mergeExtensionState(local: IStringDictionary<any> | undefined, remote: IStringDictionary<any> | undefined, base: IStringDictionary<any> | undefined): IStringDictionary<any> | undefined {
if (!local && !remote && !base) {
return undefined;
}
if (local && !remote && !base) {
return local;
}
if (remote && !local && !base) {
return remote;
}
local = local || {};
function mergeExtensionState(local: IStringDictionary<any>, remote: IStringDictionary<any> | undefined, base: IStringDictionary<any> | undefined): IStringDictionary<any> | undefined {
const merged: IStringDictionary<any> = deepClone(local);
if (remote) {
const baseToRemote = base ? compareExtensionState(base, remote) : { added: Object.keys(remote).reduce((r, k) => { r.add(k); return r; }, new Set<string>()), removed: new Set<string>(), updated: new Set<string>() };
......
......@@ -450,13 +450,13 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse
syncExntesion.installed = true;
}
const keys = this.storageKeysSyncRegistryService.getExtensioStorageKeys({ id: identifier.id, version: manifest.version });
try {
const extensionStorageValue = this.storageService.get(identifier.id, StorageScope.GLOBAL);
syncExntesion.state = keys.length && extensionStorageValue
? JSON.parse(extensionStorageValue, (key, value) => !key || keys.includes(key) ? value : undefined)
: undefined;
} catch (error) {
this.logService.info(`${this.syncResourceLogLabel}: Error while parsing extension state`, getErrorMessage(error));
if (keys) {
const extensionStorageValue = this.storageService.get(identifier.id, StorageScope.GLOBAL) || '{}';
try {
syncExntesion.state = JSON.parse(extensionStorageValue, (key, value) => !key || keys.includes(key) ? value : undefined);
} catch (error) {
this.logService.info(`${this.syncResourceLogLabel}: Error while parsing extension state`, getErrorMessage(error));
}
}
return syncExntesion;
});
......
......@@ -76,7 +76,7 @@ export interface IStorageKeysSyncRegistryService {
/**
* Returns storage keys of the given extension that has to be synchronized.
*/
getExtensioStorageKeys(extension: IExtensionIdWithVersion): ReadonlyArray<string>;
getExtensioStorageKeys(extension: IExtensionIdWithVersion): ReadonlyArray<string> | undefined;
}
export abstract class AbstractStorageKeysSyncRegistryService extends Disposable implements IStorageKeysSyncRegistryService {
......@@ -103,8 +103,8 @@ export abstract class AbstractStorageKeysSyncRegistryService extends Disposable
this._register(toDisposable(() => this._storageKeys.clear()));
}
getExtensioStorageKeys(extension: IExtensionIdWithVersion): ReadonlyArray<string> {
return this._extensionsStorageKeys.get(ExtensionIdWithVersion.toKey(extension)) || [];
getExtensioStorageKeys(extension: IExtensionIdWithVersion): ReadonlyArray<string> | undefined {
return this._extensionsStorageKeys.get(ExtensionIdWithVersion.toKey(extension));
}
protected updateExtensionStorageKeys(extension: IExtensionIdWithVersion, keys: string[]): void {
......
......@@ -731,7 +731,7 @@ class SimpleIStorageKeysSyncRegistryService implements IStorageKeysSyncRegistryS
extensionsStorageKeys = [];
getExtensioStorageKeys(): [] { return []; }
getExtensioStorageKeys() { return undefined; }
registerExtensionStorageKeys(): void { }
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册