Skip to content

Commit d967a04

Browse files
committed
fix regression
1 parent 37e216e commit d967a04

3 files changed

Lines changed: 65 additions & 26 deletions

File tree

src/features/envCommands.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ export async function setEnvManagerCommand(em: EnvironmentManagers, wm: PythonPr
341341
if (projects && projects.length > 0) {
342342
const manager = await pickEnvironmentManager(em.managers);
343343
if (manager) {
344-
await setEnvironmentManager(projects.map((p) => ({ project: p, envManager: manager })));
344+
await setEnvironmentManager(projects.map((p) => ({ project: p, envManager: manager, forceWrite: true })));
345345
}
346346
}
347347
}
@@ -351,7 +351,7 @@ export async function setPackageManagerCommand(em: EnvironmentManagers, wm: Pyth
351351
if (projects && projects.length > 0) {
352352
const manager = await pickPackageManager(em.packageManagers);
353353
if (manager) {
354-
await setPackageManager(projects.map((p) => ({ project: p, packageManager: manager })));
354+
await setPackageManager(projects.map((p) => ({ project: p, packageManager: manager, forceWrite: true })));
355355
}
356356
}
357357
}

src/features/envManagers.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,7 @@ export class PythonEnvironmentManagers implements EnvironmentManagers {
292292
project,
293293
envManager: manager.id,
294294
packageManager: packageManager.id,
295+
forceWrite: true,
295296
},
296297
]);
297298
}
@@ -336,6 +337,7 @@ export class PythonEnvironmentManagers implements EnvironmentManagers {
336337
project: this.pm.get(uri),
337338
envManager: manager.id,
338339
packageManager: manager.preferredPackageManagerId,
340+
forceWrite: true,
339341
});
340342
}
341343

@@ -355,6 +357,7 @@ export class PythonEnvironmentManagers implements EnvironmentManagers {
355357
project: undefined,
356358
envManager: manager.id,
357359
packageManager: manager.preferredPackageManagerId,
360+
forceWrite: true,
358361
});
359362
}
360363

src/features/settings/settingHelpers.ts

Lines changed: 60 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,14 @@ export interface EditAllManagerSettings {
9393
project?: PythonProject;
9494
envManager: string;
9595
packageManager: string;
96+
/** When true, always write settings even if value equals the implicit default */
97+
forceWrite?: boolean;
9698
}
9799
interface EditAllManagerSettingsInternal {
98100
project: PythonProject;
99101
envManager: string;
100102
packageManager: string;
103+
forceWrite?: boolean;
101104
}
102105
export async function setAllManagerSettings(edits: EditAllManagerSettings[]): Promise<void> {
103106
const noWorkspace: EditAllManagerSettingsInternal[] = [];
@@ -110,10 +113,20 @@ export async function setAllManagerSettings(edits: EditAllManagerSettings[]): Pr
110113
if (w) {
111114
workspaces.set(w, [
112115
...(workspaces.get(w) || []),
113-
{ project: e.project, envManager: e.envManager, packageManager: e.packageManager },
116+
{
117+
project: e.project,
118+
envManager: e.envManager,
119+
packageManager: e.packageManager,
120+
forceWrite: e.forceWrite,
121+
},
114122
]);
115123
} else {
116-
noWorkspace.push({ project: e.project, envManager: e.envManager, packageManager: e.packageManager });
124+
noWorkspace.push({
125+
project: e.project,
126+
envManager: e.envManager,
127+
packageManager: e.packageManager,
128+
forceWrite: e.forceWrite,
129+
});
117130
}
118131
});
119132

@@ -148,26 +161,30 @@ export async function setAllManagerSettings(edits: EditAllManagerSettings[]): Pr
148161
});
149162
} else {
150163
// Only write settings if:
151-
// 1. There's already an explicit setting (we're updating it), OR
152-
// 2. The new value is not the implicit fallback (system manager is the fallback)
164+
// 1. forceWrite is true (explicit user action), OR
165+
// 2. There's already an explicit setting (we're updating it), OR
166+
// 3. The new value is not the implicit fallback (system manager is the fallback)
153167
const isSystemManager = e.envManager === 'ms-python.python:system';
154168
const envManagerInspect = config.inspect<string>('defaultEnvManager');
155169
const hasExplicitEnvManager =
156170
envManagerInspect?.workspaceFolderValue !== undefined ||
157171
envManagerInspect?.workspaceValue !== undefined;
158172

159-
// Write if changing an existing setting, OR if setting to non-system manager
160-
if ((hasExplicitEnvManager || !isSystemManager) && config.get('defaultEnvManager') !== e.envManager) {
173+
// Write if forceWrite, or changing an existing setting, OR if setting to non-system manager
174+
if (
175+
(e.forceWrite || hasExplicitEnvManager || !isSystemManager) &&
176+
config.get('defaultEnvManager') !== e.envManager
177+
) {
161178
promises.push(config.update('defaultEnvManager', e.envManager, ConfigurationTarget.Workspace));
162179
}
163180

164181
const pkgManagerInspect = config.inspect<string>('defaultPackageManager');
165182
const hasExplicitPkgManager =
166183
pkgManagerInspect?.workspaceFolderValue !== undefined ||
167184
pkgManagerInspect?.workspaceValue !== undefined;
168-
// For package manager, write if there's an explicit setting OR if env manager is being written
185+
// For package manager, write if forceWrite, there's an explicit setting OR if env manager is being written
169186
if (
170-
(hasExplicitPkgManager || !isSystemManager) &&
187+
(e.forceWrite || hasExplicitPkgManager || !isSystemManager) &&
171188
config.get('defaultPackageManager') !== e.packageManager
172189
) {
173190
promises.push(
@@ -197,20 +214,24 @@ export async function setAllManagerSettings(edits: EditAllManagerSettings[]): Pr
197214
.filter((e) => !e.project)
198215
.forEach((e) => {
199216
// Only write global settings if:
200-
// 1. There's already an explicit global setting (we're updating it), OR
201-
// 2. The new value is not the implicit fallback (system manager)
217+
// 1. forceWrite is true (explicit user action), OR
218+
// 2. There's already an explicit global setting (we're updating it), OR
219+
// 3. The new value is not the implicit fallback (system manager)
202220
const isSystemManager = e.envManager === 'ms-python.python:system';
203221
const envManagerInspect = config.inspect<string>('defaultEnvManager');
204222
const hasExplicitGlobalEnvManager = envManagerInspect?.globalValue !== undefined;
205223

206-
if ((hasExplicitGlobalEnvManager || !isSystemManager) && config.get('defaultEnvManager') !== e.envManager) {
224+
if (
225+
(e.forceWrite || hasExplicitGlobalEnvManager || !isSystemManager) &&
226+
config.get('defaultEnvManager') !== e.envManager
227+
) {
207228
promises.push(config.update('defaultEnvManager', e.envManager, ConfigurationTarget.Global));
208229
}
209230

210231
const pkgManagerInspect = config.inspect<string>('defaultPackageManager');
211232
const hasExplicitGlobalPkgManager = pkgManagerInspect?.globalValue !== undefined;
212233
if (
213-
(hasExplicitGlobalPkgManager || !isSystemManager) &&
234+
(e.forceWrite || hasExplicitGlobalPkgManager || !isSystemManager) &&
214235
config.get('defaultPackageManager') !== e.packageManager
215236
) {
216237
promises.push(config.update('defaultPackageManager', e.packageManager, ConfigurationTarget.Global));
@@ -224,10 +245,13 @@ export interface EditEnvManagerSettings {
224245
// undefined means global
225246
project?: PythonProject;
226247
envManager: string;
248+
/** When true, always write settings even if value equals the implicit default */
249+
forceWrite?: boolean;
227250
}
228251
interface EditEnvManagerSettingsInternal {
229252
project: PythonProject;
230253
envManager: string;
254+
forceWrite?: boolean;
231255
}
232256
export async function setEnvironmentManager(edits: EditEnvManagerSettings[]): Promise<void> {
233257
const noWorkspace: EditEnvManagerSettingsInternal[] = [];
@@ -238,9 +262,12 @@ export async function setEnvironmentManager(edits: EditEnvManagerSettings[]): Pr
238262
.forEach((e) => {
239263
const w = workspace.getWorkspaceFolder(e.project.uri);
240264
if (w) {
241-
workspaces.set(w, [...(workspaces.get(w) || []), { project: e.project, envManager: e.envManager }]);
265+
workspaces.set(w, [
266+
...(workspaces.get(w) || []),
267+
{ project: e.project, envManager: e.envManager, forceWrite: e.forceWrite },
268+
]);
242269
} else {
243-
noWorkspace.push({ project: e.project, envManager: e.envManager });
270+
noWorkspace.push({ project: e.project, envManager: e.envManager, forceWrite: e.forceWrite });
244271
}
245272
});
246273

@@ -267,11 +294,14 @@ export async function setEnvironmentManager(edits: EditEnvManagerSettings[]): Pr
267294
overrides[index].envManager = e.envManager;
268295
projectsModified = true;
269296
} else {
270-
// Only write settings if updating existing OR setting non-system manager
297+
// Only write settings if forceWrite, updating existing OR setting non-system manager
271298
const isSystemManager = e.envManager === 'ms-python.python:system';
272299
const envManagerInspect = config.inspect<string>('defaultEnvManager');
273300
const hasExplicitEnvManager = envManagerInspect?.workspaceValue !== undefined;
274-
if ((hasExplicitEnvManager || !isSystemManager) && config.get('defaultEnvManager') !== e.envManager) {
301+
if (
302+
(e.forceWrite || hasExplicitEnvManager || !isSystemManager) &&
303+
config.get('defaultEnvManager') !== e.envManager
304+
) {
275305
promises.push(config.update('defaultEnvManager', e.envManager, ConfigurationTarget.Workspace));
276306
}
277307
}
@@ -289,11 +319,14 @@ export async function setEnvironmentManager(edits: EditEnvManagerSettings[]): Pr
289319
edits
290320
.filter((e) => !e.project)
291321
.forEach((e) => {
292-
// Only write global settings if updating existing OR setting non-system manager
322+
// Only write global settings if forceWrite, updating existing OR setting non-system manager
293323
const isSystemManager = e.envManager === 'ms-python.python:system';
294324
const envManagerInspect = config.inspect<string>('defaultEnvManager');
295325
const hasExplicitGlobalEnvManager = envManagerInspect?.globalValue !== undefined;
296-
if ((hasExplicitGlobalEnvManager || !isSystemManager) && config.get('defaultEnvManager') !== e.envManager) {
326+
if (
327+
(e.forceWrite || hasExplicitGlobalEnvManager || !isSystemManager) &&
328+
config.get('defaultEnvManager') !== e.envManager
329+
) {
297330
promises.push(config.update('defaultEnvManager', e.envManager, ConfigurationTarget.Global));
298331
}
299332
});
@@ -305,10 +338,13 @@ export interface EditPackageManagerSettings {
305338
// undefined means global
306339
project?: PythonProject;
307340
packageManager: string;
341+
/** When true, always write settings even if value equals the implicit default */
342+
forceWrite?: boolean;
308343
}
309344
interface EditPackageManagerSettingsInternal {
310345
project: PythonProject;
311346
packageManager: string;
347+
forceWrite?: boolean;
312348
}
313349
export async function setPackageManager(edits: EditPackageManagerSettings[]): Promise<void> {
314350
const noWorkspace: EditPackageManagerSettingsInternal[] = [];
@@ -321,10 +357,10 @@ export async function setPackageManager(edits: EditPackageManagerSettings[]): Pr
321357
if (w) {
322358
workspaces.set(w, [
323359
...(workspaces.get(w) || []),
324-
{ project: e.project, packageManager: e.packageManager },
360+
{ project: e.project, packageManager: e.packageManager, forceWrite: e.forceWrite },
325361
]);
326362
} else {
327-
noWorkspace.push({ project: e.project, packageManager: e.packageManager });
363+
noWorkspace.push({ project: e.project, packageManager: e.packageManager, forceWrite: e.forceWrite });
328364
}
329365
});
330366

@@ -351,12 +387,12 @@ export async function setPackageManager(edits: EditPackageManagerSettings[]): Pr
351387
overrides[index].packageManager = e.packageManager;
352388
projectsModified = true;
353389
} else {
354-
// Only write settings if updating existing OR setting non-default package manager
390+
// Only write settings if forceWrite, updating existing OR setting non-default package manager
355391
const isPipManager = e.packageManager === 'ms-python.python:pip';
356392
const pkgManagerInspect = config.inspect<string>('defaultPackageManager');
357393
const hasExplicitPkgManager = pkgManagerInspect?.workspaceValue !== undefined;
358394
if (
359-
(hasExplicitPkgManager || !isPipManager) &&
395+
(e.forceWrite || hasExplicitPkgManager || !isPipManager) &&
360396
config.get('defaultPackageManager') !== e.packageManager
361397
) {
362398
promises.push(
@@ -378,12 +414,12 @@ export async function setPackageManager(edits: EditPackageManagerSettings[]): Pr
378414
edits
379415
.filter((e) => !e.project)
380416
.forEach((e) => {
381-
// Only write global settings if updating existing OR setting non-default package manager
417+
// Only write global settings if forceWrite, updating existing OR setting non-default package manager
382418
const isPipManager = e.packageManager === 'ms-python.python:pip';
383419
const pkgManagerInspect = config.inspect<string>('defaultPackageManager');
384420
const hasExplicitGlobalPkgManager = pkgManagerInspect?.globalValue !== undefined;
385421
if (
386-
(hasExplicitGlobalPkgManager || !isPipManager) &&
422+
(e.forceWrite || hasExplicitGlobalPkgManager || !isPipManager) &&
387423
config.get('defaultPackageManager') !== e.packageManager
388424
) {
389425
promises.push(config.update('defaultPackageManager', e.packageManager, ConfigurationTarget.Global));

0 commit comments

Comments
 (0)