@@ -96,92 +96,13 @@ import { collectEnvironmentInfo, getEnvManagerAndPackageManagerConfigLevels, run
9696import { EnvironmentManagers , ProjectCreators , PythonProjectManager } from './internal.api' ;
9797import { registerSystemPythonFeatures } from './managers/builtin/main' ;
9898import { SysPythonManager } from './managers/builtin/sysPythonManager' ;
99- import {
100- createNativePythonFinder ,
101- isNativeEnvInfo ,
102- NativePythonEnvironmentKind ,
103- NativePythonFinder ,
104- } from './managers/common/nativePythonFinder' ;
99+ import { createNativePythonFinder , NativePythonFinder } from './managers/common/nativePythonFinder' ;
105100import { IDisposable } from './managers/common/types' ;
106101import { registerCondaFeatures } from './managers/conda/main' ;
107102import { registerPipenvFeatures } from './managers/pipenv/main' ;
108103import { registerPoetryFeatures } from './managers/poetry/main' ;
109104import { registerPyenvFeatures } from './managers/pyenv/main' ;
110105
111- /**
112- * Map from PET NativePythonEnvironmentKind to the manager name used in registration.
113- * Only includes kinds that have a dedicated manager (not system/venv/etc.).
114- */
115- const PET_KIND_TO_MANAGER : ReadonlyMap < NativePythonEnvironmentKind , string > = new Map ( [
116- [ NativePythonEnvironmentKind . conda , 'conda' ] ,
117- [ NativePythonEnvironmentKind . pyenv , 'pyenv' ] ,
118- [ NativePythonEnvironmentKind . pyenvVirtualEnv , 'pyenv' ] ,
119- [ NativePythonEnvironmentKind . pipenv , 'pipenv' ] ,
120- [ NativePythonEnvironmentKind . poetry , 'poetry' ] ,
121- ] ) ;
122-
123- /**
124- * Checks whether PET discovered environments whose corresponding manager did not register.
125- * Uses a soft (cached) refresh so it doesn't trigger additional PET work.
126- */
127- async function checkPetManagerMismatch (
128- nativeFinder : NativePythonFinder ,
129- envManagers : EnvironmentManagers ,
130- ) : Promise < void > {
131- const registeredIds = new Set ( envManagers . managers . map ( ( m ) => m . id ) ) ;
132-
133- // Map manager names to their expected managerId prefix
134- const managerIdPrefixes : ReadonlyMap < string , string > = new Map ( [
135- [ 'conda' , 'ms-python.python:conda' ] ,
136- [ 'pyenv' , 'ms-python.python:pyenv' ] ,
137- [ 'pipenv' , 'ms-python.python:pipenv' ] ,
138- [ 'poetry' , 'ms-python.python:poetry' ] ,
139- ] ) ;
140-
141- // Use a single cached refresh to avoid triggering per-kind hard refreshes on cache miss
142- let allEnvs ;
143- try {
144- allEnvs = await nativeFinder . refresh ( false ) ;
145- } catch {
146- // PET query failed — don't block post-init
147- return ;
148- }
149-
150- // Filter to only environment entries (not manager entries)
151- const envInfos = allEnvs . filter ( isNativeEnvInfo ) ;
152-
153- // Group PET kinds by manager name to avoid double-counting (e.g. pyenv + pyenvVirtualEnv)
154- const kindsByManager = new Map < string , NativePythonEnvironmentKind [ ] > ( ) ;
155- for ( const [ kind , managerName ] of PET_KIND_TO_MANAGER ) {
156- const existing = kindsByManager . get ( managerName ) ?? [ ] ;
157- existing . push ( kind ) ;
158- kindsByManager . set ( managerName , existing ) ;
159- }
160-
161- for ( const [ managerName , kinds ] of kindsByManager ) {
162- const expectedPrefix = managerIdPrefixes . get ( managerName ) ;
163- if ( ! expectedPrefix ) {
164- continue ;
165- }
166-
167- // Check if the corresponding manager registered
168- const isRegistered = Array . from ( registeredIds ) . some ( ( id ) => id . startsWith ( expectedPrefix ) ) ;
169- if ( isRegistered ) {
170- continue ;
171- }
172-
173- // Manager not registered — count PET environments of any related kind
174- const totalPetEnvs = envInfos . filter ( ( e ) => e . kind !== undefined && kinds . includes ( e . kind ) ) . length ;
175-
176- if ( totalPetEnvs > 0 ) {
177- sendTelemetryEvent ( EventNames . MANAGER_DISCOVERY_MISMATCH , undefined , {
178- managerName,
179- petEnvCount : totalPetEnvs ,
180- } ) ;
181- }
182- }
183- }
184-
185106export async function activate ( context : ExtensionContext ) : Promise < PythonEnvironmentApi | undefined > {
186107 // Only skip activation if user explicitly set useEnvironmentsExtension to false.
187108 // When disabled, the main Python extension handles environments instead (legacy mode).
@@ -673,9 +594,6 @@ export async function activate(context: ExtensionContext): Promise<PythonEnviron
673594
674595 // Log discovery summary to help users troubleshoot environment detection issues
675596 await logDiscoverySummary ( envManagers ) ;
676-
677- // Check for PET-vs-manager mismatches (PET found envs but manager didn't register)
678- await checkPetManagerMismatch ( nativeFinder , envManagers ) ;
679597 } catch ( postInitError ) {
680598 traceError ( 'Post-initialization tasks failed:' , postInitError ) ;
681599 }
0 commit comments