Skip to content

Commit 21be3e2

Browse files
committed
Refactor
1 parent 4632547 commit 21be3e2

10 files changed

Lines changed: 44 additions & 42 deletions

File tree

api/src/main.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -675,9 +675,9 @@ export interface PackageManager {
675675
/**
676676
* Refreshes the package list for the specified Python environment.
677677
* @param environment - The Python environment for which to refresh the package list.
678-
* @returns A promise that resolves when the refresh is complete.
678+
* @returns A promise that resolves with the refreshed list of packages, or undefined.
679679
*/
680-
refresh(environment: PythonEnvironment): Promise<void>;
680+
refresh(environment: PythonEnvironment): Promise<Package[] | undefined>;
681681

682682
/**
683683
* Retrieves the list of packages for the specified Python environment.
@@ -1041,9 +1041,9 @@ export interface PythonPackageGetterApi {
10411041
* Refresh the list of packages in a Python Environment.
10421042
*
10431043
* @param environment The Python Environment for which the list of packages is to be refreshed.
1044-
* @returns A promise that resolves when the list of packages has been refreshed.
1044+
* @returns A promise that resolves with the refreshed list of packages, or undefined.
10451045
*/
1046-
refreshPackages(environment: PythonEnvironment): Promise<void>;
1046+
refreshPackages(environment: PythonEnvironment): Promise<Package[] | undefined>;
10471047

10481048
/**
10491049
* Get the list of packages in a Python Environment.

src/api.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -669,9 +669,9 @@ export interface PackageManager {
669669
/**
670670
* Refreshes the package list for the specified Python environment.
671671
* @param environment - The Python environment for which to refresh the package list.
672-
* @returns A promise that resolves when the refresh is complete.
672+
* @returns A promise that resolves with the refreshed list of packages, or undefined.
673673
*/
674-
refresh(environment: PythonEnvironment): Promise<void>;
674+
refresh(environment: PythonEnvironment): Promise<Package[] | undefined>;
675675

676676
/**
677677
* Retrieves the list of packages for the specified Python environment.
@@ -1035,9 +1035,9 @@ export interface PythonPackageGetterApi {
10351035
* Refresh the list of packages in a Python Environment.
10361036
*
10371037
* @param environment The Python Environment for which the list of packages is to be refreshed.
1038-
* @returns A promise that resolves when the list of packages has been refreshed.
1038+
* @returns A promise that resolves with the refreshed list of packages, or undefined.
10391039
*/
1040-
refreshPackages(environment: PythonEnvironment): Promise<void>;
1040+
refreshPackages(environment: PythonEnvironment): Promise<Package[] | undefined>;
10411041

10421042
/**
10431043
* Get the list of packages in a Python Environment.

src/features/pythonApi.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ class PythonEnvironmentApiImpl implements PythonEnvironmentApi {
250250
}
251251
return manager.manage(context, options);
252252
}
253-
async refreshPackages(context: PythonEnvironment): Promise<void> {
253+
async refreshPackages(context: PythonEnvironment): Promise<Package[] | undefined> {
254254
await waitForEnvManagerId([context.envId.managerId]);
255255
const manager = this.envManagers.getPackageManager(context);
256256
if (!manager) {

src/features/views/envManagersView.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -252,11 +252,7 @@ export class EnvManagerView implements TreeDataProvider<EnvTreeItem>, Disposable
252252
const views: EnvTreeItem[] = [];
253253

254254
if (pkgManager) {
255-
let packages = await pkgManager.getPackages(environment);
256-
if (!packages || packages.length === 0) {
257-
await pkgManager.refresh(environment);
258-
packages = await pkgManager.getPackages(environment);
259-
}
255+
let packages = await pkgManager.refresh(environment);
260256
if (packages && packages.length > 0) {
261257
views.push(
262258
...packages

src/features/views/projectView.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -244,11 +244,7 @@ export class ProjectView implements TreeDataProvider<ProjectTreeItem> {
244244
return [new ProjectEnvironmentInfo(environmentItem, ProjectViews.noPackageManager)];
245245
}
246246

247-
let packages = await pkgManager.getPackages(environment);
248-
if (!packages || packages.length === 0) {
249-
await pkgManager.refresh(environment);
250-
packages = await pkgManager.getPackages(environment);
251-
}
247+
let packages = await pkgManager.refresh(environment);
252248
if (!packages) {
253249
return [new ProjectEnvironmentInfo(environmentItem, ProjectViews.noPackages)];
254250
}

src/internal.api.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ export class InternalPackageManager implements PackageManager {
364364
}
365365
}
366366

367-
refresh(environment: PythonEnvironment): Promise<void> {
367+
refresh(environment: PythonEnvironment): Promise<Package[] | undefined> {
368368
return this.manager.refresh(environment);
369369
}
370370

src/managers/builtin/pipPackageManager.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,16 +101,21 @@ export class PipPackageManager implements PackageManager, Disposable {
101101
);
102102
}
103103

104-
async refresh(environment: PythonEnvironment): Promise<void> {
105-
await window.withProgress(
104+
async refresh(environment: PythonEnvironment): Promise<Package[] | undefined> {
105+
return window.withProgress(
106106
{
107107
location: ProgressLocation.Window,
108108
title: 'Refreshing packages',
109109
},
110110
async () => {
111-
await updatePackagesAndNotify(this, environment, this.packages.get(environment.envId.id), (changes) => {
112-
this._onDidChangePackages.fire({ environment, manager: this, changes });
113-
});
111+
return updatePackagesAndNotify(
112+
this,
113+
environment,
114+
this.packages.get(environment.envId.id),
115+
(changes) => {
116+
this._onDidChangePackages.fire({ environment, manager: this, changes });
117+
},
118+
);
114119
},
115120
);
116121
}

src/managers/common/packageChanges.ts

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,13 @@ export async function updatePackagesAndNotify(
4646
environment: PythonEnvironment,
4747
before: Package[] | undefined,
4848
onChanges: PackageChangesCallback,
49-
): Promise<void> {
50-
const after = (await packageManager.getPackages(environment, { skipCache: true })) ?? [];
49+
): Promise<Package[] | undefined> {
50+
const [after, afterDirectDependenciesNames] = await Promise.all([
51+
packageManager.getPackages(environment, { skipCache: true }).then((pkgs) => pkgs ?? []),
52+
// Handle transitive dependencies (best-effort, don't break package refresh on failure)
53+
packageManager.getDirectPackageNames?.(environment).catch(() => undefined),
54+
]);
5155

52-
// Handle transitive dependencies (best-effort, don't break package refresh on failure)
53-
let afterDirectDependenciesNames: Set<string> | undefined;
54-
try {
55-
afterDirectDependenciesNames = await packageManager.getDirectPackageNames?.(environment);
56-
} catch {
57-
// If direct package detection fails, leave isTransitive undefined rather than breaking refresh
58-
}
5956
if (afterDirectDependenciesNames && afterDirectDependenciesNames.size > 0) {
6057
for (const pkg of after) {
6158
(pkg as { isTransitive?: boolean }).isTransitive = !afterDirectDependenciesNames.has(pkg.name);
@@ -67,4 +64,6 @@ export async function updatePackagesAndNotify(
6764
if (changes.length > 0) {
6865
onChanges(changes);
6966
}
67+
68+
return after;
7069
}

src/managers/conda/condaPackageManager.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,16 +95,21 @@ export class CondaPackageManager implements PackageManager, Disposable {
9595
);
9696
}
9797

98-
async refresh(environment: PythonEnvironment): Promise<void> {
99-
await withProgress(
98+
async refresh(environment: PythonEnvironment): Promise<Package[] | undefined> {
99+
return withProgress(
100100
{
101101
location: ProgressLocation.Window,
102102
title: CondaStrings.condaRefreshingPackages,
103103
},
104104
async () => {
105-
await updatePackagesAndNotify(this, environment, this.packages.get(environment.envId.id), (changes) => {
106-
this._onDidChangePackages.fire({ environment, manager: this, changes });
107-
});
105+
return updatePackagesAndNotify(
106+
this,
107+
environment,
108+
this.packages.get(environment.envId.id),
109+
(changes) => {
110+
this._onDidChangePackages.fire({ environment, manager: this, changes });
111+
},
112+
);
108113
},
109114
);
110115
}

src/managers/poetry/poetryPackageManager.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,15 +108,15 @@ export class PoetryPackageManager implements PackageManager, Disposable {
108108
);
109109
}
110110

111-
async refresh(environment: PythonEnvironment): Promise<void> {
112-
await withProgress(
111+
async refresh(environment: PythonEnvironment): Promise<Package[] | undefined> {
112+
return withProgress(
113113
{
114114
location: ProgressLocation.Window,
115115
title: 'Refreshing Poetry packages',
116116
},
117117
async () => {
118118
try {
119-
await updatePackagesAndNotify(
119+
return await updatePackagesAndNotify(
120120
this,
121121
environment,
122122
this.packages.get(environment.envId.id),
@@ -133,6 +133,7 @@ export class PoetryPackageManager implements PackageManager, Disposable {
133133
this.log.show();
134134
}
135135
});
136+
return undefined;
136137
}
137138
},
138139
);

0 commit comments

Comments
 (0)