Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/code/electron-utility/sharedProcess/contrib/defaultExtensionsInitializer.ts
5240 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { dirname, join } from '../../../../base/common/path.js';
7
import { Disposable } from '../../../../base/common/lifecycle.js';
8
import { isWindows } from '../../../../base/common/platform.js';
9
import { URI } from '../../../../base/common/uri.js';
10
import { INativeEnvironmentService } from '../../../../platform/environment/common/environment.js';
11
import { INativeServerExtensionManagementService } from '../../../../platform/extensionManagement/node/extensionManagementService.js';
12
import { ILogService } from '../../../../platform/log/common/log.js';
13
import { IStorageService, StorageScope, StorageTarget } from '../../../../platform/storage/common/storage.js';
14
import { FileOperationResult, IFileService, IFileStat, toFileOperationResult } from '../../../../platform/files/common/files.js';
15
import { getErrorMessage } from '../../../../base/common/errors.js';
16
import { IProductService } from '../../../../platform/product/common/productService.js';
17
18
const defaultExtensionsInitStatusKey = 'initializing-default-extensions';
19
20
export class DefaultExtensionsInitializer extends Disposable {
21
constructor(
22
@INativeEnvironmentService private readonly environmentService: INativeEnvironmentService,
23
@INativeServerExtensionManagementService private readonly extensionManagementService: INativeServerExtensionManagementService,
24
@IStorageService storageService: IStorageService,
25
@IFileService private readonly fileService: IFileService,
26
@ILogService private readonly logService: ILogService,
27
@IProductService private readonly productService: IProductService,
28
) {
29
super();
30
31
if (isWindows && storageService.getBoolean(defaultExtensionsInitStatusKey, StorageScope.APPLICATION, true)) {
32
storageService.store(defaultExtensionsInitStatusKey, true, StorageScope.APPLICATION, StorageTarget.MACHINE);
33
this.initializeDefaultExtensions().then(() => storageService.store(defaultExtensionsInitStatusKey, false, StorageScope.APPLICATION, StorageTarget.MACHINE));
34
}
35
}
36
37
private async initializeDefaultExtensions(): Promise<void> {
38
const extensionsLocation = this.getDefaultExtensionVSIXsLocation();
39
let stat: IFileStat;
40
try {
41
stat = await this.fileService.resolve(extensionsLocation);
42
if (!stat.children) {
43
this.logService.debug('There are no default extensions to initialize', extensionsLocation.toString());
44
return;
45
}
46
} catch (error) {
47
if (toFileOperationResult(error) === FileOperationResult.FILE_NOT_FOUND) {
48
this.logService.debug('There are no default extensions to initialize', extensionsLocation.toString());
49
return;
50
}
51
this.logService.error('Error initializing extensions', error);
52
return;
53
}
54
55
const vsixs = stat.children.filter(child => child.name.toLowerCase().endsWith('.vsix'));
56
if (vsixs.length === 0) {
57
this.logService.debug('There are no default extensions to initialize', extensionsLocation.toString());
58
return;
59
}
60
61
this.logService.info('Initializing default extensions', extensionsLocation.toString());
62
await Promise.all(vsixs.map(async vsix => {
63
this.logService.info('Installing default extension', vsix.resource.toString());
64
try {
65
await this.extensionManagementService.install(vsix.resource, { donotIncludePackAndDependencies: true, keepExisting: false });
66
this.logService.info('Default extension installed', vsix.resource.toString());
67
} catch (error) {
68
this.logService.error('Error installing default extension', vsix.resource.toString(), getErrorMessage(error));
69
}
70
}));
71
this.logService.info('Default extensions initialized', extensionsLocation.toString());
72
}
73
74
private getDefaultExtensionVSIXsLocation(): URI {
75
if (this.productService.win32VersionedUpdate) {
76
// appRoot = C:\Users\<name>\AppData\Local\Programs\Microsoft VS Code Insiders\<version>\resources\app
77
// extensionsPath = C:\Users\<name>\AppData\Local\Programs\Microsoft VS Code Insiders\<version>\bootstrap\extensions
78
return URI.file(join(dirname(dirname(dirname(this.environmentService.appRoot))), 'bootstrap', 'extensions'));
79
} else {
80
// appRoot = C:\Users\<name>\AppData\Local\Programs\Microsoft VS Code Insiders\resources\app
81
// extensionsPath = C:\Users\<name>\AppData\Local\Programs\Microsoft VS Code Insiders\bootstrap\extensions
82
return URI.file(join(dirname(dirname(this.environmentService.appRoot)), 'bootstrap', 'extensions'));
83
}
84
}
85
86
}
87
88