From 8798be4ecf9ab4dc28c2aa2857fb9c89fd31a9e3 Mon Sep 17 00:00:00 2001 From: Mohit Yadav Date: Sun, 19 Jul 2026 15:44:27 +0530 Subject: [PATCH] Fix #1599: onDidChangePythonProjects never fires on runtime project add/remove --- src/features/pythonApi.ts | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/features/pythonApi.ts b/src/features/pythonApi.ts index 0544c4fd..9dfa0999 100644 --- a/src/features/pythonApi.ts +++ b/src/features/pythonApi.ts @@ -33,6 +33,7 @@ import { } from '../api'; import { traceError, traceInfo } from '../common/logging'; import { pickEnvironmentManager } from '../common/pickers/managers'; +import { timeout } from '../common/utils/asyncUtils'; import { createDeferred } from '../common/utils/deferred'; import { checkUri } from '../common/utils/pathUtils'; import { handlePythonPath } from '../common/utils/pythonPath'; @@ -44,7 +45,6 @@ import { PythonPackageImpl, PythonProjectManager, } from '../internal.api'; -import { timeout } from '../common/utils/asyncUtils'; import { waitForAllEnvManagers, waitForEnvManager, waitForEnvManagerId } from './common/managerReady'; import { EnvVarManager } from './execution/envVariableManager'; import { runAsTask } from './execution/runAsTask'; @@ -64,6 +64,9 @@ class PythonEnvironmentApiImpl implements PythonEnvironmentApi { private readonly _onDidChangePythonProjects = new EventEmitter(); private readonly _onDidChangePackages = new EventEmitter(); private readonly _onDidChangeEnvironmentVariables = new EventEmitter(); + // Tracks the last-known project set so we can compute an added/removed delta + // whenever the underlying project manager reports a change (fix for #1599). + private previousProjects: readonly PythonProject[] = []; constructor( private readonly envManagers: EnvironmentManagers, @@ -73,6 +76,8 @@ class PythonEnvironmentApiImpl implements PythonEnvironmentApi { private readonly envVarManager: EnvVarManager, private readonly disposables: Disposable[] = [], ) { + this.previousProjects = this.projectManager.getProjects(); + this.disposables.push( this._onDidChangeEnvironment, this._onDidChangeEnvironments, @@ -87,6 +92,22 @@ class PythonEnvironmentApiImpl implements PythonEnvironmentApi { ); }), this.envVarManager.onDidChangeEnvironmentVariables((e) => this._onDidChangeEnvironmentVariables.fire(e)), + this.projectManager.onDidChangeProjects(() => { + const current = this.projectManager.getProjects(); + const added = current.filter( + (c) => !this.previousProjects.some((p) => p.uri.toString() === c.uri.toString()), + ); + const removed = this.previousProjects.filter( + (p) => !current.some((c) => c.uri.toString() === p.uri.toString()), + ); + this.previousProjects = current; + if (added.length > 0 || removed.length > 0) { + traceInfo( + `Python API: Projects changed. Added: ${added.length}, Removed: ${removed.length}`, + ); + this._onDidChangePythonProjects.fire({ added, removed }); + } + }), ); }