Path: blob/main/src/vs/sessions/contrib/workspace/browser/workspaceFolderManagement.ts
13401 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 { Disposable } from '../../../../base/common/lifecycle.js';6import { IWorkbenchContribution } from '../../../../workbench/common/contributions.js';7import { ISessionsManagementService } from '../../../services/sessions/common/sessionsManagement.js';8import { IWorkspaceContextService } from '../../../../platform/workspace/common/workspace.js';9import { IWorkspaceEditingService } from '../../../../workbench/services/workspaces/common/workspaceEditing.js';10import { IWorkspaceTrustManagementService } from '../../../../platform/workspace/common/workspaceTrust.js';11import { IUriIdentityService } from '../../../../platform/uriIdentity/common/uriIdentity.js';12import { URI } from '../../../../base/common/uri.js';13import { autorun } from '../../../../base/common/observable.js';14import { IWorkspaceFolderCreationData } from '../../../../platform/workspaces/common/workspaces.js';15import { Queue } from '../../../../base/common/async.js';16import { ISession } from '../../../services/sessions/common/session.js';1718export class WorkspaceFolderManagementContribution extends Disposable implements IWorkbenchContribution {1920static readonly ID = 'workbench.contrib.workspaceFolderManagement';21private queue = this._register(new Queue<void>());2223constructor(24@ISessionsManagementService private readonly sessionManagementService: ISessionsManagementService,25@IUriIdentityService private readonly uriIdentityService: IUriIdentityService,26@IWorkspaceContextService private readonly workspaceContextService: IWorkspaceContextService,27@IWorkspaceEditingService private readonly workspaceEditingService: IWorkspaceEditingService,28@IWorkspaceTrustManagementService private readonly workspaceTrustManagementService: IWorkspaceTrustManagementService,29) {30super();31this._register(autorun(reader => {32const activeSession = this.sessionManagementService.activeSession.read(reader);33activeSession?.workspace.read(reader);34this.queue.queue(() => this.updateWorkspaceFoldersForSession(activeSession));35}));36}3738private async updateWorkspaceFoldersForSession(session: ISession | undefined): Promise<void> {39await this.manageTrustWorkspaceForSession(session);40const activeSessionFolderData = this.getActiveSessionFolderData(session);41const currentRepo = this.workspaceContextService.getWorkspace().folders[0]?.uri;4243if (!activeSessionFolderData) {44if (currentRepo) {45await this.workspaceEditingService.removeFolders([currentRepo], true);46}47return;48}4950if (!currentRepo) {51await this.workspaceEditingService.addFolders([activeSessionFolderData], true);52return;53}5455if (this.uriIdentityService.extUri.isEqual(currentRepo, activeSessionFolderData.uri)) {56return;57}5859await this.workspaceEditingService.updateFolders(0, 1, [activeSessionFolderData], true);60}6162private getActiveSessionFolderData(session: ISession | undefined): IWorkspaceFolderCreationData | undefined {63if (!session) {64return undefined;65}6667const workspace = session.workspace.get();68const repo = workspace?.repositories[0];69const repository = repo?.uri;70const worktree = repo?.workingDirectory;71const branchName = repo?.detail;7273if (worktree) {74return {75uri: worktree,76name: repository ? `${this.uriIdentityService.extUri.basename(repository)} (${branchName ?? this.uriIdentityService.extUri.basename(worktree)})` : this.uriIdentityService.extUri.basename(worktree)77};78}7980if (repository) {81return {82uri: repository,83name: workspace?.label,84};85}8687return undefined;88}8990private async manageTrustWorkspaceForSession(session: ISession | undefined): Promise<void> {91const workspace = session?.workspace.get();92if (!workspace?.requiresWorkspaceTrust) {93return;94}9596const repo = workspace?.repositories[0];97const repository = repo?.uri;98const worktree = repo?.workingDirectory;99100if (!repository || !worktree) {101return;102}103104if (!this.isUriTrusted(worktree)) {105await this.workspaceTrustManagementService.setUrisTrust([worktree], true);106}107}108109private isUriTrusted(uri: URI): boolean {110return this.workspaceTrustManagementService.getTrustedUris().some(trustedUri => this.uriIdentityService.extUri.isEqual(trustedUri, uri));111}112}113114115