1
>
/*---------------------------------------------------------------------------------------------
extHostWorkspace.ts
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 { delta as arrayDelta, mapArrayOrNot } from '../../../base/common/arrays.js';
7
>
import { AsyncIterableProducer, Barrier } from '../../../base/common/async.js';
8
>
import { CancellationToken, CancellationTokenSource } from '../../../base/common/cancellation.js';
9
>
import { AsyncEmitter, Emitter, Event } from '../../../base/common/event.js';
10
>
import { DisposableStore, toDisposable } from '../../../base/common/lifecycle.js';
11
>
import { StopWatch } from '../../../base/common/stopwatch.js';
12
>
import { TernarySearchTree } from '../../../base/common/ternarySearchTree.js';
13
>
import { Schemas } from '../../../base/common/network.js';
14
>
import { Counter } from '../../../base/common/numbers.js';
15
>
import { basename, basenameOrAuthority, dirname, ExtUri, relativePath } from '../../../base/common/resources.js';
16
>
import { compare } from '../../../base/common/strings.js';
17
>
import { isUriComponents, URI, UriComponents } from '../../../base/common/uri.js';
18
>
import { localize } from '../../../nls.js';
19
>
import { ExtensionIdentifier, IExtensionDescription } from '../../../platform/extensions/common/extensions.js';
20
>
import { FileSystemProviderCapabilities } from '../../../platform/files/common/files.js';
21
>
import { createDecorator } from '../../../platform/instantiation/common/instantiation.js';
22
>
import { ILogService } from '../../../platform/log/common/log.js';
23
>
import { Severity } from '../../../platform/notification/common/notification.js';
24
>
import { EditSessionIdentityMatch } from '../../../platform/workspace/common/editSessions.js';
25
>
import { Workspace, WorkspaceFolder } from '../../../platform/workspace/common/workspace.js';
26
>
import { IExtHostFileSystemInfo } from './extHostFileSystemInfo.js';
27
>
import { IExtHostInitDataService } from './extHostInitDataService.js';
28
>
import { IExtHostRpcService } from './extHostRpcService.js';
29
>
import { GlobPattern } from './extHostTypeConverters.js';
30
>
import { Range } from './extHostTypes.js';
31
>
import { IURITransformerService } from './extHostUriTransformerService.js';
32
>
import { IFileQueryBuilderOptions, ISearchPatternBuilder, ITextQueryBuilderOptions } from '../../services/search/common/queryBuilder.js';
33
>
import { IRawFileMatch2, ITextSearchResult, resultIsMatch } from '../../services/search/common/search.js';
34
>
import type * as vscode from 'vscode';
35
>
import { ExtHostWorkspaceShape, IRelativePatternDto, IWorkspaceData, MainContext, MainThreadMessageOptions, MainThreadMessageServiceShape, MainThreadTelemetryShape, MainThreadWorkspaceShape } from './extHost.protocol.js';
36
>
import { revive } from '../../../base/common/marshalling.js';
37
>
import { AuthInfo, Credentials } from '../../../platform/request/common/request.js';
38
>
import { ExcludeSettingOptions, TextSearchContext2, TextSearchMatch2 } from '../../services/search/common/searchExtTypes.js';
39
>
import { bufferToStream, readableToBuffer, VSBuffer } from '../../../base/common/buffer.js';
40
>
import { toDecodeStream, toEncodeReadable, UTF8 } from '../../services/textfile/common/encoding.js';
41
>
import { consumeStream } from '../../../base/common/stream.js';
42
>
import { stringToSnapshot } from '../../services/textfile/common/textfiles.js';
43
>
// Type-only import to avoid a runtime cycle with extHostConfiguration.ts.
44
>
import type { ExtHostConfigProvider } from './extHostConfiguration.js';
45
>
46
>
export interface IExtHostWorkspaceProvider {
47
>
getWorkspaceFolder2(uri: vscode.Uri, resolveParent?: boolean): Promise<vscode.WorkspaceFolder | undefined>;
48
>
resolveWorkspaceFolder(uri: vscode.Uri): Promise<vscode.WorkspaceFolder | undefined>;
49
>
getWorkspaceFolders2(): Promise<vscode.WorkspaceFolder[] | undefined>;
50
>
resolveProxy(url: string): Promise<string | undefined>;
51
>
lookupAuthorization(authInfo: AuthInfo): Promise<Credentials | undefined>;
52
>
lookupKerberosAuthorization(url: string): Promise<string | undefined>;
53
>
loadCertificates(): Promise<string[]>;
54
>
}
55
>
56
function isFolderEqual(folderA: URI, folderB: URI, extHostFileSystemInfo: IExtHostFileSystemInfo): boolean {
57
return new ExtUri(uri => ignorePathCasing(uri, extHostFileSystemInfo)).isEqual(folderA, folderB);
58
}
60
function compareWorkspaceFolderByUri(a: vscode.WorkspaceFolder, b: vscode.WorkspaceFolder, extHostFileSystemInfo: IExtHostFileSystemInfo): number {
61
return isFolderEqual(a.uri, b.uri, extHostFileSystemInfo) ? 0 : compare(a.uri.toString(), b.uri.toString());
62
}
64
function compareWorkspaceFolderByUriAndNameAndIndex(a: vscode.WorkspaceFolder, b: vscode.WorkspaceFolder, extHostFileSystemInfo: IExtHostFileSystemInfo): number {
65
if (a.index !== b.index) {