Skip to content

Commit 1740d7d

Browse files
authored
1 parent 5d76058 commit 1740d7d

File tree

5 files changed

+76
-29
lines changed

5 files changed

+76
-29
lines changed

src/vs/platform/extensionManagement/common/extensionsProfileScannerService.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,8 +270,9 @@ export abstract class AbstractExtensionsProfileScannerService extends Disposable
270270
migrate = true;
271271
e.metadata.hasPreReleaseVersion = true;
272272
}
273+
const uuid = e.metadata?.id ?? e.identifier.uuid;
273274
extensions.push({
274-
identifier: e.identifier,
275+
identifier: uuid ? { id: e.identifier.id, uuid } : { id: e.identifier.id },
275276
location,
276277
version: e.version,
277278
metadata: e.metadata,

src/vs/platform/extensionManagement/common/extensionsScannerService.ts

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,12 @@ import { IUserDataProfile, IUserDataProfilesService } from '../../userDataProfil
3535
import { IUriIdentityService } from '../../uriIdentity/common/uriIdentity.js';
3636
import { localizeManifest } from './extensionNls.js';
3737

38-
export type IScannedExtensionManifest = IRelaxedExtensionManifest & { __metadata?: Metadata };
38+
export type ManifestMetadata = Partial<{
39+
installedTimestamp: number;
40+
size: number;
41+
}>;
42+
43+
export type IScannedExtensionManifest = IRelaxedExtensionManifest & { __metadata?: ManifestMetadata };
3944

4045
interface IRelaxedScannedExtension {
4146
type: ExtensionType;
@@ -136,7 +141,7 @@ export interface IExtensionsScannerService {
136141
scanMultipleExtensions(extensionLocations: URI[], extensionType: ExtensionType, scanOptions: ScanOptions): Promise<IScannedExtension[]>;
137142
scanOneOrMultipleExtensions(extensionLocation: URI, extensionType: ExtensionType, scanOptions: ScanOptions): Promise<IScannedExtension[]>;
138143

139-
updateMetadata(extensionLocation: URI, metadata: Partial<Metadata>): Promise<void>;
144+
updateManifestMetadata(extensionLocation: URI, metadata: ManifestMetadata): Promise<void>;
140145
initializeDefaultProfileExtensions(): Promise<void>;
141146
}
142147

@@ -270,18 +275,10 @@ export abstract class AbstractExtensionsScannerService extends Disposable implem
270275
return this.applyScanOptions(extensions, extensionType, { includeInvalid: scanOptions.includeInvalid, pickLatest: true });
271276
}
272277

273-
async updateMetadata(extensionLocation: URI, metaData: Partial<Metadata>): Promise<void> {
278+
async updateManifestMetadata(extensionLocation: URI, metaData: ManifestMetadata): Promise<void> {
274279
const manifestLocation = joinPath(extensionLocation, 'package.json');
275280
const content = (await this.fileService.readFile(manifestLocation)).value.toString();
276281
const manifest: IScannedExtensionManifest = JSON.parse(content);
277-
278-
// unset if false
279-
if (metaData.isMachineScoped === false) {
280-
delete metaData.isMachineScoped;
281-
}
282-
if (metaData.isBuiltin === false) {
283-
delete metaData.isBuiltin;
284-
}
285282
manifest.__metadata = { ...manifest.__metadata, ...metaData };
286283

287284
await this.fileService.writeFile(joinPath(extensionLocation, 'package.json'), VSBuffer.fromString(JSON.stringify(manifest, null, '\t')));
@@ -665,10 +662,20 @@ class ExtensionsScanner extends Disposable {
665662
if (!manifest.publisher) {
666663
manifest.publisher = UNDEFINED_PUBLISHER;
667664
}
668-
const metadata = scannedProfileExtension?.metadata ?? manifest.__metadata;
669-
if (metadata && !metadata?.size && manifest.__metadata?.size) {
670-
metadata.size = manifest.__metadata?.size;
665+
666+
let metadata: Metadata | undefined;
667+
if (scannedProfileExtension) {
668+
metadata = {
669+
...scannedProfileExtension.metadata,
670+
size: manifest.__metadata?.size,
671+
};
672+
} else if (manifest.__metadata) {
673+
metadata = {
674+
installedTimestamp: manifest.__metadata.installedTimestamp,
675+
size: manifest.__metadata.size,
676+
};
671677
}
678+
672679
delete manifest.__metadata;
673680
const id = getGalleryExtensionId(manifest.publisher, manifest.name);
674681
const identifier = metadata?.id ? { id, uuid: metadata.id } : { id };

src/vs/platform/extensionManagement/node/extensionManagementService.ts

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import {
3737
} from '../common/extensionManagement.js';
3838
import { areSameExtensions, computeTargetPlatform, ExtensionKey, getGalleryExtensionId, groupByExtension } from '../common/extensionManagementUtil.js';
3939
import { IExtensionsProfileScannerService, IScannedProfileExtension } from '../common/extensionsProfileScannerService.js';
40-
import { IExtensionsScannerService, IScannedExtension, UserExtensionsScanOptions } from '../common/extensionsScannerService.js';
40+
import { IExtensionsScannerService, IScannedExtension, ManifestMetadata, UserExtensionsScanOptions } from '../common/extensionsScannerService.js';
4141
import { ExtensionsDownloader } from './extensionDownloader.js';
4242
import { ExtensionsLifecycle } from './extensionLifecycle.js';
4343
import { fromExtractError, getManifest } from './extensionManagementUtil.js';
@@ -624,7 +624,7 @@ export class ExtensionsScanner extends Disposable {
624624
throw fromExtractError(e);
625625
}
626626

627-
const metadata: Metadata = { installedTimestamp: Date.now() };
627+
const metadata: ManifestMetadata = { installedTimestamp: Date.now() };
628628
try {
629629
metadata.size = await computeSize(tempLocation, this.fileService);
630630
} catch (error) {
@@ -633,7 +633,7 @@ export class ExtensionsScanner extends Disposable {
633633
}
634634

635635
try {
636-
await this.extensionsScannerService.updateMetadata(tempLocation, metadata);
636+
await this.extensionsScannerService.updateManifestMetadata(tempLocation, metadata);
637637
} catch (error) {
638638
this.telemetryService.publicLog2<UpdateMetadataErrorEvent, UpdateMetadataErrorClassification>('extension:extract', { extensionId: extensionKey.id, code: `${toFileOperationResult(error)}` });
639639
throw toExtensionManagementError(error, ExtensionManagementErrorCode.UpdateMetadata);
@@ -678,13 +678,9 @@ export class ExtensionsScanner extends Disposable {
678678
return extensions.find(e => areSameExtensions(e.identifier, local.identifier));
679679
}
680680

681-
async updateMetadata(local: ILocalExtension, metadata: Partial<Metadata>, profileLocation?: URI): Promise<ILocalExtension> {
681+
async updateMetadata(local: ILocalExtension, metadata: Partial<Metadata>, profileLocation: URI): Promise<ILocalExtension> {
682682
try {
683-
if (profileLocation) {
684-
await this.extensionsProfileScannerService.updateMetadata([[local, metadata]], profileLocation);
685-
} else {
686-
await this.extensionsScannerService.updateMetadata(local.location, metadata);
687-
}
683+
await this.extensionsProfileScannerService.updateMetadata([[local, metadata]], profileLocation);
688684
} catch (error) {
689685
this.telemetryService.publicLog2<UpdateMetadataErrorEvent, UpdateMetadataErrorClassification>('extension:extract', { extensionId: local.identifier.id, code: `${toFileOperationResult(error)}`, isProfile: !!profileLocation });
690686
throw toExtensionManagementError(error, ExtensionManagementErrorCode.UpdateMetadata);
@@ -873,7 +869,7 @@ export class ExtensionsScanner extends Disposable {
873869
// set size if not set before
874870
if (isDefined(extension.metadata?.installedTimestamp) && isUndefined(extension.metadata?.size)) {
875871
const size = await computeSize(extension.location, this.fileService);
876-
await this.extensionsScannerService.updateMetadata(extension.location, { size });
872+
await this.extensionsScannerService.updateManifestMetadata(extension.location, { size });
877873
}
878874
}));
879875
}

src/vs/platform/extensionManagement/test/common/extensionsProfileScannerService.test.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,28 @@ suite('ExtensionsProfileScannerService', () => {
574574
assert.ok(target4.notCalled);
575575
});
576576

577+
test('read extension when uuid is different in identifier and manifest', async () => {
578+
const extensionsManifest = joinPath(extensionsLocation, 'extensions.json');
579+
await instantiationService.get(IFileService).writeFile(extensionsManifest, VSBuffer.fromString(JSON.stringify([{
580+
identifier: {
581+
id: 'pub.a',
582+
uuid: 'uuid1`'
583+
},
584+
version: '1.0.0',
585+
location: joinPath(extensionsLocation, 'pub.a-1.0.0').toString(),
586+
relativeLocation: 'pub.a-1.0.0',
587+
metadata: {
588+
id: 'uuid',
589+
}
590+
}])));
591+
592+
const testObject = disposables.add(instantiationService.createInstance(TestObject, extensionsLocation));
593+
const actual = await testObject.scanProfileExtensions(extensionsManifest);
594+
assert.deepStrictEqual(actual.length, 1);
595+
assert.deepStrictEqual(actual[0].identifier.id, 'pub.a');
596+
assert.deepStrictEqual(actual[0].identifier.uuid, 'uuid');
597+
});
598+
577599
function aExtension(id: string, location: URI, e?: Partial<IExtension>, manifest?: Partial<IExtensionManifest>): IExtension {
578600
return {
579601
identifier: { id },

src/vs/platform/extensionManagement/test/node/extensionsScannerService.test.ts

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,20 +105,20 @@ suite('NativeExtensionsScanerService Test', () => {
105105
});
106106

107107
test('scan user extensions', async () => {
108-
const manifest: Partial<IScannedExtensionManifest> = anExtensionManifest({ 'name': 'name', 'publisher': 'pub', __metadata: { id: 'uuid' } });
108+
const manifest: Partial<IScannedExtensionManifest> = anExtensionManifest({ 'name': 'name', 'publisher': 'pub' });
109109
const extensionLocation = await aUserExtension(manifest);
110110
const testObject: IExtensionsScannerService = disposables.add(instantiationService.createInstance(ExtensionsScannerService));
111111

112112
const actual = await testObject.scanAllUserExtensions();
113113

114114
assert.deepStrictEqual(actual.length, 1);
115-
assert.deepStrictEqual(actual[0].identifier, { id: 'pub.name', uuid: 'uuid' });
115+
assert.deepStrictEqual(actual[0].identifier, { id: 'pub.name' });
116116
assert.deepStrictEqual(actual[0].location.toString(), extensionLocation.toString());
117117
assert.deepStrictEqual(actual[0].isBuiltin, false);
118118
assert.deepStrictEqual(actual[0].type, ExtensionType.User);
119119
assert.deepStrictEqual(actual[0].isValid, true);
120120
assert.deepStrictEqual(actual[0].validations, []);
121-
assert.deepStrictEqual(actual[0].metadata, { id: 'uuid' });
121+
assert.deepStrictEqual(actual[0].metadata, undefined);
122122
assert.deepStrictEqual(actual[0].targetPlatform, TargetPlatform.UNDEFINED);
123123
delete manifest.__metadata;
124124
assert.deepStrictEqual(actual[0].manifest, manifest);
@@ -298,6 +298,27 @@ suite('NativeExtensionsScanerService Test', () => {
298298
assert.deepStrictEqual(actual!.manifest.displayName, 'Hello World');
299299
});
300300

301+
test('scan single extension with manifest metadata retains manifest metadata', async () => {
302+
const manifest: Partial<IExtensionManifest> = anExtensionManifest({ 'name': 'name', 'publisher': 'pub' });
303+
const extensionLocation = await aUserExtension({
304+
...manifest,
305+
__metadata: { size: 12345, installedTimestamp: 1234567890 }
306+
});
307+
const testObject: IExtensionsScannerService = disposables.add(instantiationService.createInstance(ExtensionsScannerService));
308+
309+
const actual = await testObject.scanExistingExtension(extensionLocation, ExtensionType.User, {});
310+
311+
assert.notStrictEqual(actual, null);
312+
assert.deepStrictEqual(actual!.identifier, { id: 'pub.name' });
313+
assert.deepStrictEqual(actual!.location.toString(), extensionLocation.toString());
314+
assert.deepStrictEqual(actual!.isBuiltin, false);
315+
assert.deepStrictEqual(actual!.type, ExtensionType.User);
316+
assert.deepStrictEqual(actual!.isValid, true);
317+
assert.deepStrictEqual(actual!.validations, []);
318+
assert.deepStrictEqual(actual!.metadata, { size: 12345, installedTimestamp: 1234567890 });
319+
assert.deepStrictEqual(actual!.manifest, manifest);
320+
});
321+
301322
async function aUserExtension(manifest: Partial<IScannedExtensionManifest>): Promise<URI> {
302323
const environmentService = instantiationService.get(INativeEnvironmentService);
303324
return anExtension(manifest, URI.file(environmentService.extensionsPath));
@@ -310,7 +331,7 @@ suite('NativeExtensionsScanerService Test', () => {
310331

311332
async function anExtension(manifest: Partial<IScannedExtensionManifest>, root: URI): Promise<URI> {
312333
const fileService = instantiationService.get(IFileService);
313-
const extensionLocation = joinPath(root, `${manifest.publisher}.${manifest.name}-${manifest.version}-${manifest.__metadata?.targetPlatform ?? TargetPlatform.UNDEFINED}`);
334+
const extensionLocation = joinPath(root, `${manifest.publisher}.${manifest.name}-${manifest.version}`);
314335
await fileService.writeFile(joinPath(extensionLocation, 'package.json'), VSBuffer.fromString(JSON.stringify(manifest)));
315336
return extensionLocation;
316337
}

0 commit comments

Comments
 (0)