Skip to content

Commit c815a85

Browse files
authored
Fix syncing extensions when new property is added (microsoft#188462)
- make isApplicationScoped property optional - bump the version so that older clients wont remove isApplicationScoped - make the client compatible when new properties are added later
1 parent fdac076 commit c815a85

File tree

3 files changed

+16
-17
lines changed

3 files changed

+16
-17
lines changed

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

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ function areSame(fromExtension: ISyncExtension, toExtension: ISyncExtension, che
278278
return false;
279279
}
280280

281-
if (fromExtension.isApplicationScoped !== toExtension.isApplicationScoped) {
281+
if (!!fromExtension.isApplicationScoped !== !!toExtension.isApplicationScoped) {
282282
/* extension application scope has changed */
283283
return false;
284284
}
@@ -395,30 +395,32 @@ function isSameExtensionState(a: IStringDictionary<any> = {}, b: IStringDictiona
395395

396396
// massage incoming extension - add optional properties
397397
function massageIncomingExtension(extension: ISyncExtension): ISyncExtension {
398-
return { ...extension, ...{ disabled: !!extension.disabled, installed: !!extension.installed, isApplicationScoped: !!extension.isApplicationScoped } };
398+
return { ...extension, ...{ disabled: !!extension.disabled, installed: !!extension.installed } };
399399
}
400400

401401
// massage outgoing extension - remove optional properties
402402
function massageOutgoingExtension(extension: ISyncExtension, key: string): ISyncExtension {
403403
const massagedExtension: ISyncExtension = {
404+
...extension,
404405
identifier: {
405406
id: extension.identifier.id,
406407
uuid: key.startsWith('uuid:') ? key.substring('uuid:'.length) : undefined
407408
},
408-
version: extension.version,
409409
/* set following always so that to differentiate with older clients */
410410
preRelease: !!extension.preRelease,
411411
pinned: !!extension.pinned,
412-
isApplicationScoped: !!extension.isApplicationScoped,
413412
};
414-
if (extension.disabled) {
415-
massagedExtension.disabled = true;
413+
if (!extension.disabled) {
414+
delete massagedExtension.disabled;
416415
}
417-
if (extension.installed) {
418-
massagedExtension.installed = true;
416+
if (!extension.installed) {
417+
delete massagedExtension.installed;
419418
}
420-
if (extension.state) {
421-
massagedExtension.state = extension.state;
419+
if (!extension.state) {
420+
delete massagedExtension.state;
421+
}
422+
if (!extension.isApplicationScoped) {
423+
delete massagedExtension.isApplicationScoped;
422424
}
423425
return massagedExtension;
424426
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,8 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse
101101
*/
102102
/* Version 4: Change settings from `sync.${setting}` to `settingsSync.{setting}` */
103103
/* Version 5: Introduce extension state */
104-
protected readonly version: number = 5;
104+
/* Version 6: Added isApplicationScoped property */
105+
protected readonly version: number = 6;
105106

106107
private readonly previewResource: URI = this.extUri.joinPath(this.syncPreviewFolder, 'extensions.json');
107108
private readonly baseResource: URI = this.previewResource.with({ scheme: USER_DATA_SYNC_SCHEME, authority: 'base' });
@@ -377,7 +378,7 @@ export class LocalExtensionsProvider {
377378
.map(extension => {
378379
const { identifier, isBuiltin, manifest, preRelease, pinned, isApplicationScoped } = extension;
379380
const syncExntesion: ILocalSyncExtension = { identifier, preRelease, version: manifest.version, pinned: !!pinned };
380-
if (!isApplicationScopedExtension(manifest)) {
381+
if (isApplicationScoped && !isApplicationScopedExtension(manifest)) {
381382
syncExntesion.isApplicationScoped = isApplicationScoped;
382383
}
383384
if (disabledExtensions.some(disabledExtension => areSameExtensions(disabledExtension, identifier))) {

src/vs/platform/userDataSync/test/common/extensionsMerge.test.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1344,7 +1344,7 @@ suite('ExtensionsMerge', () => {
13441344
assert.deepStrictEqual(actual.local.added, []);
13451345
assert.deepStrictEqual(actual.local.removed, []);
13461346
assert.deepStrictEqual(actual.local.updated, []);
1347-
assert.deepStrictEqual(actual.remote?.all, localExtensions);
1347+
assert.deepStrictEqual(actual.remote?.all, [anExpectedSyncExtension({ identifier: { id: 'a', uuid: 'a' } })]);
13481348
});
13491349

13501350
test('sync merging when applicaiton scope is changed locally', () => {
@@ -1392,7 +1392,6 @@ suite('ExtensionsMerge', () => {
13921392
pinned: false,
13931393
preRelease: false,
13941394
installed: true,
1395-
isApplicationScoped: false,
13961395
...extension
13971396
};
13981397
}
@@ -1403,7 +1402,6 @@ suite('ExtensionsMerge', () => {
14031402
version: '1.0.0',
14041403
pinned: false,
14051404
preRelease: false,
1406-
isApplicationScoped: false,
14071405
...extension
14081406
};
14091407
}
@@ -1415,7 +1413,6 @@ suite('ExtensionsMerge', () => {
14151413
pinned: false,
14161414
preRelease: false,
14171415
installed: true,
1418-
isApplicationScoped: false,
14191416
...extension
14201417
};
14211418
}
@@ -1427,7 +1424,6 @@ suite('ExtensionsMerge', () => {
14271424
pinned: false,
14281425
preRelease: false,
14291426
installed: true,
1430-
isApplicationScoped: false,
14311427
...extension
14321428
};
14331429
}

0 commit comments

Comments
 (0)