Skip to content

Commit 3932262

Browse files
authored
prioritize workspace selected env over process.env.CONDA_PREFIX (#1398)
`getCondaForWorkspace()` prioritizes `process.env.CONDA_PREFIX` over the persisted workspace selection (commit `b546ac4`, PR #1243). This is at `src/managers/conda/condaUtils.ts#L85-L87`. Fix: swap the order so Memento state is checked first, `CONDA_PREFIX` is fallback only. fixes #1347
1 parent a0c5757 commit 3932262

File tree

2 files changed

+118
-9
lines changed

2 files changed

+118
-9
lines changed

src/managers/conda/condaUtils.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -82,19 +82,21 @@ export function getCondaPathSetting(): string | undefined {
8282
}
8383

8484
export async function getCondaForWorkspace(fsPath: string): Promise<string | undefined> {
85+
// Check persisted user selection first so explicit choices survive restarts
86+
const state = await getWorkspacePersistentState();
87+
const data = await state.get<unknown>(CONDA_WORKSPACE_KEY);
88+
if (data && typeof data === 'object') {
89+
const workspaceSelections = data as { [key: string]: string };
90+
if (Object.prototype.hasOwnProperty.call(workspaceSelections, fsPath)) {
91+
return workspaceSelections[fsPath];
92+
}
93+
}
94+
95+
// Fall back to CONDA_PREFIX only when no explicit selection exists
8596
if (process.env.CONDA_PREFIX) {
8697
return process.env.CONDA_PREFIX;
8798
}
8899

89-
const state = await getWorkspacePersistentState();
90-
const data: { [key: string]: string } | undefined = await state.get(CONDA_WORKSPACE_KEY);
91-
if (data) {
92-
try {
93-
return data[fsPath];
94-
} catch {
95-
return undefined;
96-
}
97-
}
98100
return undefined;
99101
}
100102

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
import assert from 'assert';
2+
import * as sinon from 'sinon';
3+
import * as persistentState from '../../../common/persistentState';
4+
import { CONDA_WORKSPACE_KEY, getCondaForWorkspace } from '../../../managers/conda/condaUtils';
5+
6+
suite('Conda Utils - getCondaForWorkspace prioritization', () => {
7+
let mockState: { get: sinon.SinonStub; set: sinon.SinonStub };
8+
let getWorkspacePersistentStateStub: sinon.SinonStub;
9+
let originalCondaPrefix: string | undefined;
10+
11+
setup(() => {
12+
originalCondaPrefix = process.env.CONDA_PREFIX;
13+
14+
mockState = {
15+
get: sinon.stub(),
16+
set: sinon.stub().resolves(),
17+
};
18+
getWorkspacePersistentStateStub = sinon.stub(persistentState, 'getWorkspacePersistentState');
19+
getWorkspacePersistentStateStub.resolves(mockState);
20+
});
21+
22+
teardown(() => {
23+
if (originalCondaPrefix === undefined) {
24+
delete process.env.CONDA_PREFIX;
25+
} else {
26+
process.env.CONDA_PREFIX = originalCondaPrefix;
27+
}
28+
sinon.restore();
29+
});
30+
31+
test('Persisted selection takes priority over CONDA_PREFIX', async () => {
32+
const workspacePath = '/home/user/project';
33+
const userSelectedEnv = '/home/user/miniconda3/envs/myenv';
34+
process.env.CONDA_PREFIX = '/home/user/miniconda3';
35+
36+
mockState.get.withArgs(CONDA_WORKSPACE_KEY).resolves({
37+
[workspacePath]: userSelectedEnv,
38+
});
39+
40+
const result = await getCondaForWorkspace(workspacePath);
41+
42+
assert.strictEqual(result, userSelectedEnv);
43+
});
44+
45+
test('CONDA_PREFIX is used as fallback when no persisted selection exists', async () => {
46+
const workspacePath = '/home/user/project';
47+
const condaBase = '/home/user/miniconda3';
48+
process.env.CONDA_PREFIX = condaBase;
49+
50+
mockState.get.withArgs(CONDA_WORKSPACE_KEY).resolves(undefined);
51+
52+
const result = await getCondaForWorkspace(workspacePath);
53+
54+
assert.strictEqual(result, condaBase);
55+
});
56+
57+
test('CONDA_PREFIX is used when persisted data exists but not for this workspace', async () => {
58+
const workspacePath = '/home/user/project';
59+
const condaBase = '/home/user/miniconda3';
60+
process.env.CONDA_PREFIX = condaBase;
61+
62+
mockState.get.withArgs(CONDA_WORKSPACE_KEY).resolves({
63+
'/home/user/other-project': '/home/user/miniconda3/envs/other',
64+
});
65+
66+
const result = await getCondaForWorkspace(workspacePath);
67+
68+
assert.strictEqual(result, condaBase);
69+
});
70+
71+
test('Returns undefined when no persisted selection and no CONDA_PREFIX', async () => {
72+
delete process.env.CONDA_PREFIX;
73+
74+
mockState.get.withArgs(CONDA_WORKSPACE_KEY).resolves(undefined);
75+
76+
const result = await getCondaForWorkspace('/home/user/project');
77+
78+
assert.strictEqual(result, undefined);
79+
});
80+
81+
test('Returns persisted selection when CONDA_PREFIX is not set', async () => {
82+
const workspacePath = '/home/user/project';
83+
const userSelectedEnv = '/home/user/miniconda3/envs/myenv';
84+
delete process.env.CONDA_PREFIX;
85+
86+
mockState.get.withArgs(CONDA_WORKSPACE_KEY).resolves({
87+
[workspacePath]: userSelectedEnv,
88+
});
89+
90+
const result = await getCondaForWorkspace(workspacePath);
91+
92+
assert.strictEqual(result, userSelectedEnv);
93+
});
94+
95+
test('Returns persisted empty string without falling back to CONDA_PREFIX', async () => {
96+
const workspacePath = '/home/user/project';
97+
process.env.CONDA_PREFIX = '/home/user/miniconda3';
98+
99+
mockState.get.withArgs(CONDA_WORKSPACE_KEY).resolves({
100+
[workspacePath]: '',
101+
});
102+
103+
const result = await getCondaForWorkspace(workspacePath);
104+
105+
assert.strictEqual(result, '');
106+
});
107+
});

0 commit comments

Comments
 (0)