Skip to content

Commit d6f0a7a

Browse files
authored
Merge branch 'main' into package-manager-integration-coverage
2 parents a8f4e67 + 89cce49 commit d6f0a7a

13 files changed

Lines changed: 505 additions & 1057 deletions

File tree

docs/startup-flow.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ All three trigger `initialize()` lazily (once-only, guarded by `_initialized` de
9191
---
9292

9393
POST-INIT:
94-
1. register terminal package watcher
94+
1. register package watchers for workspace-selected and terminal-activated environments
9595
2. register settings change listener (`registerInterpreterSettingsChangeListener`) — re-runs priority chain if settings change
9696
3. initialize terminal manager
9797
4. send telemetry (manager selection, project structure, discovery summary)

src/extension.ts

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -86,26 +86,26 @@ import { cleanupStartupScripts } from './features/terminal/shellStartupSetupHand
8686
import { TerminalActivationImpl } from './features/terminal/terminalActivationState';
8787
import { TerminalEnvVarInjector } from './features/terminal/terminalEnvVarInjector';
8888
import { TerminalManager, TerminalManagerImpl } from './features/terminal/terminalManager';
89-
import { registerTerminalPackageWatcher } from './features/terminal/terminalPackageWatcher';
9089
import { getEnvironmentForTerminal } from './features/terminal/utils';
9190
import { openSearchSettings } from './features/views/envManagerSearch';
9291
import { EnvManagerView } from './features/views/envManagersView';
9392
import { ProjectView } from './features/views/projectView';
9493
import { PythonStatusBarImpl } from './features/views/pythonStatusBar';
9594
import { updateViewsAndStatus } from './features/views/revealHandler';
9695
import { TemporaryStateManager } from './features/views/temporaryStateManager';
97-
import { ProjectItem, PythonEnvTreeItem } from './features/views/treeViewItems';
96+
import { PythonEnvTreeItem } from './features/views/treeViewItems';
9897
import { collectEnvironmentInfo, getEnvManagerAndPackageManagerConfigLevels, runPetInTerminalImpl } from './helpers';
9998
import { EnvironmentManagers, ProjectCreators, PythonProjectManager } from './internal.api';
100-
import { registerSystemPythonFeatures } from './managers/builtin/main';
10199
import { registerInlineScriptFeatures } from './managers/builtin/inlineScript/main';
100+
import { registerSystemPythonFeatures } from './managers/builtin/main';
102101
import { SysPythonManager } from './managers/builtin/sysPythonManager';
103102
import {
104103
createNativePythonFinder,
105104
getNativePythonToolsPathAndSource,
106105
getNativePythonToolsVersion,
107106
NativePythonFinder,
108107
} from './managers/common/nativePythonFinder';
108+
import { registerPackageWatchers } from './managers/common/packageWatcher';
109109
import { IDisposable } from './managers/common/types';
110110
import { registerCondaFeatures } from './managers/conda/main';
111111
import { registerPipenvFeatures } from './managers/pipenv/main';
@@ -364,17 +364,7 @@ export async function activate(context: ExtensionContext): Promise<PythonEnviron
364364
});
365365
}),
366366
commands.registerCommand('python-envs.removePythonProject', async (item) => {
367-
// Clear environment association before removing project
368-
if (item instanceof ProjectItem) {
369-
const uri = item.project.uri;
370-
const manager = envManagers.getEnvironmentManager(uri);
371-
if (manager) {
372-
manager.set(uri, undefined);
373-
} else {
374-
traceError(`No environment manager found for ${uri.fsPath}`);
375-
}
376-
}
377-
await removePythonProject(item, projectManager);
367+
await removePythonProject(item, projectManager, envManagers);
378368
}),
379369
commands.registerCommand('python-envs.clearCache', async () => {
380370
await clearPersistentState();
@@ -672,6 +662,8 @@ export async function activate(context: ExtensionContext): Promise<PythonEnviron
672662
safeRegister('shellStartupVars', shellStartupVarsMgr.initialize()),
673663
]);
674664

665+
context.subscriptions.push(registerPackageWatchers(envManagers, terminalActivation, outputChannel));
666+
675667
failureStage = 'envSelection';
676668
stageWatch.reset();
677669
await applyInitialEnvironmentSelection(
@@ -683,11 +675,6 @@ export async function activate(context: ExtensionContext): Promise<PythonEnviron
683675
globalScopeDeferredRef,
684676
);
685677

686-
// Register manager-agnostic terminal watcher for package-modifying commands
687-
failureStage = 'terminalWatcher';
688-
stageWatch.reset();
689-
registerTerminalPackageWatcher(api, terminalActivation, outputChannel, context.subscriptions);
690-
691678
// Register listener for interpreter settings changes for interpreter re-selection
692679
failureStage = 'settingsListener';
693680
stageWatch.reset();

src/features/envCommands.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -652,7 +652,12 @@ export async function addPythonProjectCommand(
652652
}
653653
}
654654

655-
export async function removePythonProject(item: ProjectItem, wm: PythonProjectManager): Promise<void> {
655+
export async function removePythonProject(
656+
item: ProjectItem,
657+
wm: PythonProjectManager,
658+
em: EnvironmentManagers,
659+
): Promise<void> {
660+
await em.setEnvironment(item.project.uri, undefined);
656661
await removePythonProjectSetting([{ project: item.project }]);
657662
wm.remove(item.project);
658663
}

src/features/terminal/terminalPackageWatcher.ts

Lines changed: 0 additions & 111 deletions
This file was deleted.

src/internal.api.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { Pep440Version } from '@renovatebot/pep440';
2-
import { CancellationError, Disposable, Event, LogOutputChannel, MarkdownString, Uri } from 'vscode';
2+
import { CancellationError, Disposable, Event, LogOutputChannel, MarkdownString, RelativePattern, Uri } from 'vscode';
33
import {
44
CreateEnvironmentOptions,
55
CreateEnvironmentScope,
@@ -381,6 +381,10 @@ export class InternalPackageManager implements PackageManager {
381381
return this.manager.getPackages(environment, options);
382382
}
383383

384+
getPackageWatchTargets(environment: PythonEnvironment): RelativePattern[] {
385+
return this.manager.getPackageWatchTargets?.(environment) ?? [];
386+
}
387+
384388
onDidChangePackages(handler: (e: DidChangePackagesEventArgs) => void): Disposable {
385389
return this.manager.onDidChangePackages ? this.manager.onDidChangePackages(handler) : new Disposable(() => {});
386390
}

src/managers/builtin/main.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { createSimpleDebounce } from '../../common/utils/debounce';
44
import { createFileSystemWatcher, onDidDeleteFiles } from '../../common/workspace.apis';
55
import { getPythonApi } from '../../features/pythonApi';
66
import { NativePythonFinder } from '../common/nativePythonFinder';
7-
import { registerPackageWatcherForManager } from '../common/packageWatcher';
87
import { PipPackageManager } from './pipPackageManager';
98
import { SysPythonManager } from './sysPythonManager';
109
import { VenvManager } from './venvManager';
@@ -41,9 +40,4 @@ export async function registerSystemPythonFeatures(
4140
venvDebouncedRefresh.trigger();
4241
}),
4342
);
44-
45-
disposables.push(
46-
registerPackageWatcherForManager(envManager, pkgManager, log),
47-
registerPackageWatcherForManager(venvManager, pkgManager, log),
48-
);
4943
}

src/managers/builtin/pipPackageManager.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,11 @@ export class PipPackageManager implements PackageManager, Disposable {
133133
async getPackages(environment: PythonEnvironment, options?: GetPackagesOptions): Promise<Package[] | undefined> {
134134
if (options?.skipCache || !this.packages.has(environment.envId.id)) {
135135
const data = await refreshPipPackages(environment, this.log);
136-
const packages = (data ?? []).map((pkg) => this.api.createPackageItem(pkg, environment, this));
136+
if (data === undefined) {
137+
return this.packages.get(environment.envId.id);
138+
}
139+
140+
const packages = data.map((pkg) => this.api.createPackageItem(pkg, environment, this));
137141
this.packages.set(environment.envId.id, packages);
138142
return packages;
139143
}

0 commit comments

Comments
 (0)