@@ -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}
9799interface EditAllManagerSettingsInternal {
98100 project : PythonProject ;
99101 envManager : string ;
100102 packageManager : string ;
103+ forceWrite ?: boolean ;
101104}
102105export 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}
228251interface EditEnvManagerSettingsInternal {
229252 project : PythonProject ;
230253 envManager : string ;
254+ forceWrite ?: boolean ;
231255}
232256export 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}
309344interface EditPackageManagerSettingsInternal {
310345 project : PythonProject ;
311346 packageManager : string ;
347+ forceWrite ?: boolean ;
312348}
313349export 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