Skip to content

Commit 4ec56c8

Browse files
committed
Fix: Use JSON package listing in conda environment
1 parent 2331581 commit 4ec56c8

1 file changed

Lines changed: 36 additions & 10 deletions

File tree

src/managers/conda/condaUtils.ts

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1077,31 +1077,57 @@ export async function deleteCondaEnvironment(environment: PythonEnvironment, log
10771077
);
10781078
}
10791079

1080+
/**
1081+
* JSON structure returned by `conda list --json`
1082+
*/
1083+
interface CondaPackageJson {
1084+
name: string;
1085+
version: string;
1086+
build_string?: string;
1087+
channel?: string;
1088+
}
1089+
1090+
/**
1091+
* Refreshes the list of packages installed in a conda environment.
1092+
* Uses `conda list -p <prefix> --json` for reliable parsing.
1093+
*
1094+
* @param environment The Python environment to get packages for
1095+
* @param api The Python environment API
1096+
* @param manager The package manager instance
1097+
* @returns Promise resolving to an array of Package objects
1098+
*/
10801099
export async function refreshPackages(
10811100
environment: PythonEnvironment,
10821101
api: PythonEnvironmentApi,
10831102
manager: PackageManager,
10841103
): Promise<Package[]> {
1085-
let args = ['list', '-p', environment.environmentPath.fsPath];
1104+
const args = ['list', '-p', environment.environmentPath.fsPath, '--json'];
10861105
const data = await runCondaExecutable(args);
1087-
const content = data.split(/\r?\n/).filter((l) => !l.startsWith('#'));
1106+
1107+
let condaPackages: CondaPackageJson[];
1108+
try {
1109+
condaPackages = JSON.parse(data) as CondaPackageJson[];
1110+
} catch (e) {
1111+
traceError(`Failed to parse conda list JSON output: ${data}`, e);
1112+
return [];
1113+
}
1114+
10881115
const packages: Package[] = [];
1089-
content.forEach((l) => {
1090-
const parts = l.split(' ').filter((p) => p.length > 0);
1091-
if (parts.length >= 3) {
1116+
for (const condaPkg of condaPackages) {
1117+
if (condaPkg.name && condaPkg.version) {
10921118
const pkg = api.createPackageItem(
10931119
{
1094-
name: parts[0],
1095-
displayName: parts[0],
1096-
version: parts[1],
1097-
description: parts[1],
1120+
name: condaPkg.name,
1121+
displayName: condaPkg.name,
1122+
version: condaPkg.version,
1123+
description: condaPkg.version,
10981124
},
10991125
environment,
11001126
manager,
11011127
);
11021128
packages.push(pkg);
11031129
}
1104-
});
1130+
}
11051131
return packages;
11061132
}
11071133

0 commit comments

Comments
 (0)