Path: blob/main/src/vs/code/electron-utility/sharedProcess/contrib/defaultExtensionsInitializer.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { dirname, join } from '../../../../base/common/path.js';6import { Disposable } from '../../../../base/common/lifecycle.js';7import { isWindows } from '../../../../base/common/platform.js';8import { URI } from '../../../../base/common/uri.js';9import { INativeEnvironmentService } from '../../../../platform/environment/common/environment.js';10import { INativeServerExtensionManagementService } from '../../../../platform/extensionManagement/node/extensionManagementService.js';11import { ILogService } from '../../../../platform/log/common/log.js';12import { IStorageService, StorageScope, StorageTarget } from '../../../../platform/storage/common/storage.js';13import { FileOperationResult, IFileService, IFileStat, toFileOperationResult } from '../../../../platform/files/common/files.js';14import { getErrorMessage } from '../../../../base/common/errors.js';1516const defaultExtensionsInitStatusKey = 'initializing-default-extensions';1718export class DefaultExtensionsInitializer extends Disposable {19constructor(20@INativeEnvironmentService private readonly environmentService: INativeEnvironmentService,21@INativeServerExtensionManagementService private readonly extensionManagementService: INativeServerExtensionManagementService,22@IStorageService storageService: IStorageService,23@IFileService private readonly fileService: IFileService,24@ILogService private readonly logService: ILogService,25) {26super();2728if (isWindows && storageService.getBoolean(defaultExtensionsInitStatusKey, StorageScope.APPLICATION, true)) {29storageService.store(defaultExtensionsInitStatusKey, true, StorageScope.APPLICATION, StorageTarget.MACHINE);30this.initializeDefaultExtensions().then(() => storageService.store(defaultExtensionsInitStatusKey, false, StorageScope.APPLICATION, StorageTarget.MACHINE));31}32}3334private async initializeDefaultExtensions(): Promise<void> {35const extensionsLocation = this.getDefaultExtensionVSIXsLocation();36let stat: IFileStat;37try {38stat = await this.fileService.resolve(extensionsLocation);39if (!stat.children) {40this.logService.debug('There are no default extensions to initialize', extensionsLocation.toString());41return;42}43} catch (error) {44if (toFileOperationResult(error) === FileOperationResult.FILE_NOT_FOUND) {45this.logService.debug('There are no default extensions to initialize', extensionsLocation.toString());46return;47}48this.logService.error('Error initializing extensions', error);49return;50}5152const vsixs = stat.children.filter(child => child.name.toLowerCase().endsWith('.vsix'));53if (vsixs.length === 0) {54this.logService.debug('There are no default extensions to initialize', extensionsLocation.toString());55return;56}5758this.logService.info('Initializing default extensions', extensionsLocation.toString());59await Promise.all(vsixs.map(async vsix => {60this.logService.info('Installing default extension', vsix.resource.toString());61try {62await this.extensionManagementService.install(vsix.resource, { donotIncludePackAndDependencies: true, keepExisting: false });63this.logService.info('Default extension installed', vsix.resource.toString());64} catch (error) {65this.logService.error('Error installing default extension', vsix.resource.toString(), getErrorMessage(error));66}67}));68this.logService.info('Default extensions initialized', extensionsLocation.toString());69}7071private getDefaultExtensionVSIXsLocation(): URI {72// appRoot = C:\Users\<name>\AppData\Local\Programs\Microsoft VS Code Insiders\resources\app73// extensionsPath = C:\Users\<name>\AppData\Local\Programs\Microsoft VS Code Insiders\bootstrap\extensions74return URI.file(join(dirname(dirname(this.environmentService.appRoot)), 'bootstrap', 'extensions'));75}7677}787980