Path: blob/main/src/vs/code/electron-utility/sharedProcess/contrib/defaultExtensionsInitializer.ts
5240 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';15import { IProductService } from '../../../../platform/product/common/productService.js';1617const defaultExtensionsInitStatusKey = 'initializing-default-extensions';1819export class DefaultExtensionsInitializer extends Disposable {20constructor(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@IProductService private readonly productService: IProductService,27) {28super();2930if (isWindows && storageService.getBoolean(defaultExtensionsInitStatusKey, StorageScope.APPLICATION, true)) {31storageService.store(defaultExtensionsInitStatusKey, true, StorageScope.APPLICATION, StorageTarget.MACHINE);32this.initializeDefaultExtensions().then(() => storageService.store(defaultExtensionsInitStatusKey, false, StorageScope.APPLICATION, StorageTarget.MACHINE));33}34}3536private async initializeDefaultExtensions(): Promise<void> {37const extensionsLocation = this.getDefaultExtensionVSIXsLocation();38let stat: IFileStat;39try {40stat = await this.fileService.resolve(extensionsLocation);41if (!stat.children) {42this.logService.debug('There are no default extensions to initialize', extensionsLocation.toString());43return;44}45} catch (error) {46if (toFileOperationResult(error) === FileOperationResult.FILE_NOT_FOUND) {47this.logService.debug('There are no default extensions to initialize', extensionsLocation.toString());48return;49}50this.logService.error('Error initializing extensions', error);51return;52}5354const vsixs = stat.children.filter(child => child.name.toLowerCase().endsWith('.vsix'));55if (vsixs.length === 0) {56this.logService.debug('There are no default extensions to initialize', extensionsLocation.toString());57return;58}5960this.logService.info('Initializing default extensions', extensionsLocation.toString());61await Promise.all(vsixs.map(async vsix => {62this.logService.info('Installing default extension', vsix.resource.toString());63try {64await this.extensionManagementService.install(vsix.resource, { donotIncludePackAndDependencies: true, keepExisting: false });65this.logService.info('Default extension installed', vsix.resource.toString());66} catch (error) {67this.logService.error('Error installing default extension', vsix.resource.toString(), getErrorMessage(error));68}69}));70this.logService.info('Default extensions initialized', extensionsLocation.toString());71}7273private getDefaultExtensionVSIXsLocation(): URI {74if (this.productService.win32VersionedUpdate) {75// appRoot = C:\Users\<name>\AppData\Local\Programs\Microsoft VS Code Insiders\<version>\resources\app76// extensionsPath = C:\Users\<name>\AppData\Local\Programs\Microsoft VS Code Insiders\<version>\bootstrap\extensions77return URI.file(join(dirname(dirname(dirname(this.environmentService.appRoot))), 'bootstrap', 'extensions'));78} else {79// appRoot = C:\Users\<name>\AppData\Local\Programs\Microsoft VS Code Insiders\resources\app80// extensionsPath = C:\Users\<name>\AppData\Local\Programs\Microsoft VS Code Insiders\bootstrap\extensions81return URI.file(join(dirname(dirname(this.environmentService.appRoot)), 'bootstrap', 'extensions'));82}83}8485}868788