Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/sessions/contrib/workspace/browser/workspaceFolderManagement.ts
13401 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 { Disposable } from '../../../../base/common/lifecycle.js';
7
import { IWorkbenchContribution } from '../../../../workbench/common/contributions.js';
8
import { ISessionsManagementService } from '../../../services/sessions/common/sessionsManagement.js';
9
import { IWorkspaceContextService } from '../../../../platform/workspace/common/workspace.js';
10
import { IWorkspaceEditingService } from '../../../../workbench/services/workspaces/common/workspaceEditing.js';
11
import { IWorkspaceTrustManagementService } from '../../../../platform/workspace/common/workspaceTrust.js';
12
import { IUriIdentityService } from '../../../../platform/uriIdentity/common/uriIdentity.js';
13
import { URI } from '../../../../base/common/uri.js';
14
import { autorun } from '../../../../base/common/observable.js';
15
import { IWorkspaceFolderCreationData } from '../../../../platform/workspaces/common/workspaces.js';
16
import { Queue } from '../../../../base/common/async.js';
17
import { ISession } from '../../../services/sessions/common/session.js';
18
19
export class WorkspaceFolderManagementContribution extends Disposable implements IWorkbenchContribution {
20
21
static readonly ID = 'workbench.contrib.workspaceFolderManagement';
22
private queue = this._register(new Queue<void>());
23
24
constructor(
25
@ISessionsManagementService private readonly sessionManagementService: ISessionsManagementService,
26
@IUriIdentityService private readonly uriIdentityService: IUriIdentityService,
27
@IWorkspaceContextService private readonly workspaceContextService: IWorkspaceContextService,
28
@IWorkspaceEditingService private readonly workspaceEditingService: IWorkspaceEditingService,
29
@IWorkspaceTrustManagementService private readonly workspaceTrustManagementService: IWorkspaceTrustManagementService,
30
) {
31
super();
32
this._register(autorun(reader => {
33
const activeSession = this.sessionManagementService.activeSession.read(reader);
34
activeSession?.workspace.read(reader);
35
this.queue.queue(() => this.updateWorkspaceFoldersForSession(activeSession));
36
}));
37
}
38
39
private async updateWorkspaceFoldersForSession(session: ISession | undefined): Promise<void> {
40
await this.manageTrustWorkspaceForSession(session);
41
const activeSessionFolderData = this.getActiveSessionFolderData(session);
42
const currentRepo = this.workspaceContextService.getWorkspace().folders[0]?.uri;
43
44
if (!activeSessionFolderData) {
45
if (currentRepo) {
46
await this.workspaceEditingService.removeFolders([currentRepo], true);
47
}
48
return;
49
}
50
51
if (!currentRepo) {
52
await this.workspaceEditingService.addFolders([activeSessionFolderData], true);
53
return;
54
}
55
56
if (this.uriIdentityService.extUri.isEqual(currentRepo, activeSessionFolderData.uri)) {
57
return;
58
}
59
60
await this.workspaceEditingService.updateFolders(0, 1, [activeSessionFolderData], true);
61
}
62
63
private getActiveSessionFolderData(session: ISession | undefined): IWorkspaceFolderCreationData | undefined {
64
if (!session) {
65
return undefined;
66
}
67
68
const workspace = session.workspace.get();
69
const repo = workspace?.repositories[0];
70
const repository = repo?.uri;
71
const worktree = repo?.workingDirectory;
72
const branchName = repo?.detail;
73
74
if (worktree) {
75
return {
76
uri: worktree,
77
name: repository ? `${this.uriIdentityService.extUri.basename(repository)} (${branchName ?? this.uriIdentityService.extUri.basename(worktree)})` : this.uriIdentityService.extUri.basename(worktree)
78
};
79
}
80
81
if (repository) {
82
return {
83
uri: repository,
84
name: workspace?.label,
85
};
86
}
87
88
return undefined;
89
}
90
91
private async manageTrustWorkspaceForSession(session: ISession | undefined): Promise<void> {
92
const workspace = session?.workspace.get();
93
if (!workspace?.requiresWorkspaceTrust) {
94
return;
95
}
96
97
const repo = workspace?.repositories[0];
98
const repository = repo?.uri;
99
const worktree = repo?.workingDirectory;
100
101
if (!repository || !worktree) {
102
return;
103
}
104
105
if (!this.isUriTrusted(worktree)) {
106
await this.workspaceTrustManagementService.setUrisTrust([worktree], true);
107
}
108
}
109
110
private isUriTrusted(uri: URI): boolean {
111
return this.workspaceTrustManagementService.getTrustedUris().some(trustedUri => this.uriIdentityService.extUri.isEqual(trustedUri, uri));
112
}
113
}
114
115