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
3296 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
17
const defaultExtensionsInitStatusKey = 'initializing-default-extensions';
18
19
export class DefaultExtensionsInitializer extends Disposable {
20
constructor(
21
@INativeEnvironmentService private readonly environmentService: INativeEnvironmentService,
22
@INativeServerExtensionManagementService private readonly extensionManagementService: INativeServerExtensionManagementService,
23
@IStorageService storageService: IStorageService,
24
@IFileService private readonly fileService: IFileService,
25
@ILogService private readonly logService: ILogService,
26
) {
27
super();
28
29
if (isWindows && storageService.getBoolean(defaultExtensionsInitStatusKey, StorageScope.APPLICATION, true)) {
30
storageService.store(defaultExtensionsInitStatusKey, true, StorageScope.APPLICATION, StorageTarget.MACHINE);
31
this.initializeDefaultExtensions().then(() => storageService.store(defaultExtensionsInitStatusKey, false, StorageScope.APPLICATION, StorageTarget.MACHINE));
32
}
33
}
34
35
private async initializeDefaultExtensions(): Promise<void> {
36
const extensionsLocation = this.getDefaultExtensionVSIXsLocation();
37
let stat: IFileStat;
38
try {
39
stat = await this.fileService.resolve(extensionsLocation);
40
if (!stat.children) {
41
this.logService.debug('There are no default extensions to initialize', extensionsLocation.toString());
42
return;
43
}
44
} catch (error) {
45
if (toFileOperationResult(error) === FileOperationResult.FILE_NOT_FOUND) {
46
this.logService.debug('There are no default extensions to initialize', extensionsLocation.toString());
47
return;
48
}
49
this.logService.error('Error initializing extensions', error);
50
return;
51
}
52
53
const vsixs = stat.children.filter(child => child.name.toLowerCase().endsWith('.vsix'));
54
if (vsixs.length === 0) {
55
this.logService.debug('There are no default extensions to initialize', extensionsLocation.toString());
56
return;
57
}
58
59
this.logService.info('Initializing default extensions', extensionsLocation.toString());
60
await Promise.all(vsixs.map(async vsix => {
61
this.logService.info('Installing default extension', vsix.resource.toString());
62
try {
63
await this.extensionManagementService.install(vsix.resource, { donotIncludePackAndDependencies: true, keepExisting: false });
64
this.logService.info('Default extension installed', vsix.resource.toString());
65
} catch (error) {
66
this.logService.error('Error installing default extension', vsix.resource.toString(), getErrorMessage(error));
67
}
68
}));
69
this.logService.info('Default extensions initialized', extensionsLocation.toString());
70
}
71
72
private getDefaultExtensionVSIXsLocation(): URI {
73
// appRoot = C:\Users\<name>\AppData\Local\Programs\Microsoft VS Code Insiders\resources\app
74
// extensionsPath = C:\Users\<name>\AppData\Local\Programs\Microsoft VS Code Insiders\bootstrap\extensions
75
return URI.file(join(dirname(dirname(this.environmentService.appRoot)), 'bootstrap', 'extensions'));
76
}
77
78
}
79
80