Skip to content

Commit d07ae6d

Browse files
author
Kartik Raj
authored
Move discovery code into their correct modules (#16707)
* Move conda.ts * Move poetry.ts Rename Fix poetry * Rename pipEnvHelper.ts to pipenv.ts * Move pipenv.ts * Refactor pyenv domain knowledge out of the locator * Move pyenv.ts * Move and rename virtualEnvironmentIdentifier.ts * Move condaLocator.ts * Move customVirtualEnvLocator.ts * Move globalVirtualEnvLocator.ts * Move poetryLocator.ts * Move posixKnownPathsLocator.ts * Move pyenvLocator.ts * Move windowsRegistryLocator.ts * Move windowsStoreLocator.ts * Refactor Windows Store domain knowledge out of the locator * Refactor new discovery code from index.ts and move it * Remove environmentInfoService.ts Rename * Remove unnecessary async signatures in pyenv
1 parent 9414956 commit d07ae6d

62 files changed

Lines changed: 616 additions & 636 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/client/common/installer/pipEnvInstaller.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import { inject, injectable } from 'inversify';
55
import { IInterpreterLocatorService, IInterpreterService, PIPENV_SERVICE } from '../../interpreter/contracts';
66
import { IServiceContainer } from '../../ioc/types';
7-
import { isPipenvEnvironmentRelatedToFolder } from '../../pythonEnvironments/discovery/locators/services/pipEnvHelper';
7+
import { isPipenvEnvironmentRelatedToFolder } from '../../pythonEnvironments/common/environmentManagers/pipenv';
88
import { EnvironmentType, ModuleInstallerType } from '../../pythonEnvironments/info';
99
import { IWorkspaceService } from '../application/types';
1010
import { inDiscoveryExperiment } from '../experiments/helpers';

src/client/common/installer/poetryInstaller.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import * as path from 'path';
88
import { Uri } from 'vscode';
99
import { IInterpreterService } from '../../interpreter/contracts';
1010
import { IServiceContainer } from '../../ioc/types';
11-
import { isPoetryEnvironmentRelatedToFolder } from '../../pythonEnvironments/discovery/locators/services/poetry';
11+
import { isPoetryEnvironmentRelatedToFolder } from '../../pythonEnvironments/common/environmentManagers/poetry';
1212
import { EnvironmentType, ModuleInstallerType } from '../../pythonEnvironments/info';
1313
import { IWorkspaceService } from '../application/types';
1414
import { inDiscoveryExperiment } from '../experiments/helpers';

src/client/common/process/pythonEnvironment.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT License.
33

4-
import { CondaEnvironmentInfo } from '../../pythonEnvironments/discovery/locators/services/conda';
4+
import { CondaEnvironmentInfo } from '../../pythonEnvironments/common/environmentManagers/conda';
55
import { buildPythonExecInfo, PythonExecInfo } from '../../pythonEnvironments/exec';
66
import { InterpreterInformation } from '../../pythonEnvironments/info';
77
import { getExecutablePath } from '../../pythonEnvironments/info/executable';

src/client/common/process/pythonExecutionFactory.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { Uri } from 'vscode';
77
import { IEnvironmentActivationService } from '../../interpreter/activation/types';
88
import { IComponentAdapter, ICondaLocatorService, ICondaService } from '../../interpreter/contracts';
99
import { IServiceContainer } from '../../ioc/types';
10-
import { CondaEnvironmentInfo } from '../../pythonEnvironments/discovery/locators/services/conda';
10+
import { CondaEnvironmentInfo } from '../../pythonEnvironments/common/environmentManagers/conda';
1111
import { inDiscoveryExperiment } from '../experiments/helpers';
1212
import { sendTelemetryEvent } from '../../telemetry';
1313
import { EventName } from '../../telemetry/constants';

src/client/common/terminal/environmentActivationProviders/pipEnvActivationProvider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { inject, injectable, named } from 'inversify';
77
import { Uri } from 'vscode';
88
import '../../extensions';
99
import { IInterpreterService } from '../../../interpreter/contracts';
10-
import { isPipenvEnvironmentRelatedToFolder } from '../../../pythonEnvironments/discovery/locators/services/pipEnvHelper';
10+
import { isPipenvEnvironmentRelatedToFolder } from '../../../pythonEnvironments/common/environmentManagers/pipenv';
1111
import { EnvironmentType } from '../../../pythonEnvironments/info';
1212
import { IWorkspaceService } from '../../application/types';
1313
import { inDiscoveryExperiment } from '../../experiments/helpers';

src/client/interpreter/contracts.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { CodeLensProvider, ConfigurationTarget, Disposable, Event, TextDocument,
33
import { IExtensionSingleActivationService } from '../activation/types';
44
import { Resource } from '../common/types';
55
import { PythonEnvSource } from '../pythonEnvironments/base/info';
6-
import { CondaEnvironmentInfo, CondaInfo } from '../pythonEnvironments/discovery/locators/services/conda';
6+
import { CondaEnvironmentInfo, CondaInfo } from '../pythonEnvironments/common/environmentManagers/conda';
77
import { EnvironmentType, PythonEnvironment } from '../pythonEnvironments/info';
88

99
export const INTERPRETER_LOCATOR_SERVICE = 'IInterpreterLocatorService';

src/client/pythonEnvironments/info/environmentInfoService.ts renamed to src/client/pythonEnvironments/base/info/environmentInfoService.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT License.
33

4-
import { traceVerbose } from '../../common/logger';
5-
import { IDisposableRegistry } from '../../common/types';
6-
import { createDeferred, Deferred } from '../../common/utils/async';
7-
import { createRunningWorkerPool, IWorkerPool, QueuePosition } from '../../common/utils/workerPool';
8-
import { getInterpreterInfo, InterpreterInformation } from '../base/info/interpreter';
9-
import { buildPythonExecInfo } from '../exec';
4+
import { traceVerbose } from '../../../common/logger';
5+
import { IDisposableRegistry } from '../../../common/types';
6+
import { createDeferred, Deferred } from '../../../common/utils/async';
7+
import { createRunningWorkerPool, IWorkerPool, QueuePosition } from '../../../common/utils/workerPool';
8+
import { getInterpreterInfo, InterpreterInformation } from './interpreter';
9+
import { buildPythonExecInfo } from '../../exec';
1010

1111
export enum EnvironmentInfoServiceQueuePriority {
1212
Default,

src/client/pythonEnvironments/base/locators/composite/environmentsResolver.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { cloneDeep } from 'lodash';
55
import { Event, EventEmitter } from 'vscode';
66
import { traceVerbose } from '../../../../common/logger';
77
import { identifyEnvironment } from '../../../common/environmentIdentifier';
8-
import { IEnvironmentInfoService } from '../../../info/environmentInfoService';
8+
import { IEnvironmentInfoService } from '../../info/environmentInfoService';
99
import { PythonEnvInfo } from '../../info';
1010
import { getEnvDisplayString } from '../../info/env';
1111
import { InterpreterInformation } from '../../info/interpreter';

src/client/pythonEnvironments/base/locators/composite/resolverUtils.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ import {
1313
getPythonVersionFromPath,
1414
} from '../../../common/commonUtils';
1515
import { getFileInfo, getWorkspaceFolders, isParentPath } from '../../../common/externalDependencies';
16-
import { AnacondaCompanyName, Conda } from '../../../discovery/locators/services/conda';
17-
import { parsePyenvVersion } from '../../../discovery/locators/services/pyenvLocator';
16+
import { AnacondaCompanyName, Conda } from '../../../common/environmentManagers/conda';
17+
import { parsePyenvVersion } from '../../../common/environmentManagers/pyenv';
1818
import { Architecture, getOSType, OSType } from '../../../../common/utils/platform';
1919
import { getPythonVersionFromPath as parsePythonVersionFromPath, parseVersion } from '../../info/pythonVersion';
2020
import { getRegistryInterpreters, getRegistryInterpretersSync } from '../../../common/windowsUtils';
@@ -169,7 +169,7 @@ async function resolvePyenvEnv(executablePath: string): Promise<PythonEnvInfo> {
169169

170170
// The sub-directory name sometimes can contain distro and python versions.
171171
// here we attempt to extract the texts out of the name.
172-
const versionStrings = await parsePyenvVersion(name);
172+
const versionStrings = parsePyenvVersion(name);
173173

174174
const envInfo = buildEnvInfo({
175175
kind: PythonEnvKind.Pyenv,
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
// eslint-disable-next-line max-classes-per-file
5+
import { Uri } from 'vscode';
6+
import { iterEmpty } from '../../../common/utils/async';
7+
import { getURIFilter } from '../../../common/utils/misc';
8+
import { Disposables, IDisposable } from '../../../common/utils/resourceLifecycle';
9+
import { PythonEnvInfo } from '../info';
10+
import { ILocator, IPythonEnvsIterator, PythonLocatorQuery } from '../locator';
11+
import { combineIterators, Locators } from '../locators';
12+
import { LazyResourceBasedLocator } from './common/resourceBasedLocator';
13+
14+
/**
15+
* A wrapper around all locators used by the extension.
16+
*/
17+
18+
export class ExtensionLocators<I = PythonEnvInfo> extends Locators<I> {
19+
constructor(
20+
// These are expected to be low-level locators (e.g. system).
21+
nonWorkspace: ILocator<I>[],
22+
// This is expected to be a locator wrapping any found in
23+
// the workspace (i.e. WorkspaceLocators).
24+
workspace: ILocator<I>,
25+
) {
26+
super([...nonWorkspace, workspace]);
27+
}
28+
}
29+
type WorkspaceLocatorFactoryResult<I> = ILocator<I> & Partial<IDisposable>;
30+
type WorkspaceLocatorFactory<I = PythonEnvInfo> = (root: Uri) => WorkspaceLocatorFactoryResult<I>[];
31+
type RootURI = string;
32+
33+
export type WatchRootsArgs = {
34+
initRoot(root: Uri): void;
35+
addRoot(root: Uri): void;
36+
removeRoot(root: Uri): void;
37+
};
38+
type WatchRootsFunc = (args: WatchRootsArgs) => IDisposable;
39+
// XXX Factor out RootedLocators and MultiRootedLocators.
40+
/**
41+
* The collection of all workspace-specific locators used by the extension.
42+
*
43+
* The factories are used to produce the locators for each workspace folder.
44+
*/
45+
46+
export class WorkspaceLocators<I = PythonEnvInfo> extends LazyResourceBasedLocator<I> {
47+
private readonly locators: Record<RootURI, [ILocator<I>, IDisposable]> = {};
48+
49+
private readonly roots: Record<RootURI, Uri> = {};
50+
51+
constructor(private readonly watchRoots: WatchRootsFunc, private readonly factories: WorkspaceLocatorFactory<I>[]) {
52+
super();
53+
}
54+
55+
public async dispose(): Promise<void> {
56+
await super.dispose();
57+
58+
// Clear all the roots.
59+
const roots = Object.keys(this.roots).map((key) => this.roots[key]);
60+
roots.forEach((root) => this.removeRoot(root));
61+
}
62+
63+
protected doIterEnvs(query?: PythonLocatorQuery): IPythonEnvsIterator<I> {
64+
const iterators = Object.keys(this.locators).map((key) => {
65+
if (query?.searchLocations !== undefined) {
66+
const root = this.roots[key];
67+
// Match any related search location.
68+
const filter = getURIFilter(root, { checkParent: true, checkChild: true, checkExact: true });
69+
// Ignore any requests for global envs.
70+
if (!query.searchLocations.roots.some(filter)) {
71+
// This workspace folder did not match the query, so skip it!
72+
return iterEmpty<I>();
73+
}
74+
}
75+
// The query matches or was not location-specific.
76+
const [locator] = this.locators[key];
77+
return locator.iterEnvs(query);
78+
});
79+
return combineIterators(iterators);
80+
}
81+
82+
protected async initResources(): Promise<void> {
83+
const disposable = this.watchRoots({
84+
initRoot: (root: Uri) => this.addRoot(root),
85+
addRoot: (root: Uri) => {
86+
// Drop the old one, if necessary.
87+
this.removeRoot(root);
88+
this.addRoot(root);
89+
this.emitter.fire({ searchLocation: root });
90+
},
91+
removeRoot: (root: Uri) => {
92+
this.removeRoot(root);
93+
this.emitter.fire({ searchLocation: root });
94+
},
95+
});
96+
this.disposables.push(disposable);
97+
}
98+
99+
private addRoot(root: Uri): void {
100+
// Create the root's locator, wrapping each factory-generated locator.
101+
const locators: ILocator<I>[] = [];
102+
const disposables = new Disposables();
103+
this.factories.forEach((create) => {
104+
create(root).forEach((loc) => {
105+
locators.push(loc);
106+
if (loc.dispose !== undefined) {
107+
disposables.push(loc as IDisposable);
108+
}
109+
});
110+
});
111+
const locator = new Locators(locators);
112+
// Cache it.
113+
const key = root.toString();
114+
this.locators[key] = [locator, disposables];
115+
this.roots[key] = root;
116+
// Hook up the watchers.
117+
disposables.push(
118+
locator.onChanged((e) => {
119+
if (e.searchLocation === undefined) {
120+
e.searchLocation = root;
121+
}
122+
this.emitter.fire(e);
123+
}),
124+
);
125+
}
126+
127+
private removeRoot(root: Uri): void {
128+
const key = root.toString();
129+
const found = this.locators[key];
130+
if (found === undefined) {
131+
return;
132+
}
133+
const [, disposables] = found;
134+
delete this.locators[key];
135+
delete this.roots[key];
136+
disposables.dispose();
137+
}
138+
}

0 commit comments

Comments
 (0)