@@ -166,15 +166,15 @@ export class PresetsController implements vscode.Disposable {
166
166
preset . setOriginalUserPresetsFile ( folder , presetsFile ) ;
167
167
} ;
168
168
169
- private async resetPresetsFile ( file : string , setExpandedPresets : SetPresetsFileFunc , setPresetsPlusIncluded : SetPresetsFileFunc , setOriginalPresetsFile : SetPresetsFileFunc , fileExistCallback : ( fileExists : boolean ) => void , referencedFiles : Set < string > ) {
169
+ private async resetPresetsFile ( file : string , setExpandedPresets : SetPresetsFileFunc , setPresetsPlusIncluded : SetPresetsFileFunc , setOriginalPresetsFile : SetPresetsFileFunc , fileExistCallback : ( fileExists : boolean ) => void , referencedFiles : Map < string , preset . PresetsFile | undefined > ) {
170
170
const presetsFileBuffer = await this . readPresetsFile ( file ) ;
171
171
172
172
// There might be a better location for this, but for now this is the best one...
173
173
fileExistCallback ( Boolean ( presetsFileBuffer ) ) ;
174
174
175
175
// Record the file as referenced, even if the file does not exist.
176
- referencedFiles . add ( file ) ;
177
176
let presetsFile = await this . parsePresetsFile ( presetsFileBuffer , file ) ;
177
+ referencedFiles . set ( file , presetsFile ) ;
178
178
if ( presetsFile ) {
179
179
// Parse again so we automatically have a copy by value
180
180
setOriginalPresetsFile ( this . folderPath , await this . parsePresetsFile ( presetsFileBuffer , file ) ) ;
@@ -203,14 +203,14 @@ export class PresetsController implements vscode.Disposable {
203
203
// Need to reapply presets every time presets changed since the binary dir or cmake path could change
204
204
// (need to clean or reload driver)
205
205
async reapplyPresets ( ) {
206
- const referencedFiles : Set < string > = new Set ( ) ;
206
+ const referencedFiles : Map < string , preset . PresetsFile | undefined > = new Map ( ) ;
207
207
208
208
// Reset all changes due to expansion since parents could change
209
209
await this . resetPresetsFile ( this . presetsPath , this . _setExpandedPresets , this . _setPresetsPlusIncluded , this . _setOriginalPresetsFile , exists => this . _presetsFileExists = exists , referencedFiles ) ;
210
210
await this . resetPresetsFile ( this . userPresetsPath , this . _setExpandedUserPresetsFile , this . _setUserPresetsPlusIncluded , this . _setOriginalUserPresetsFile , exists => this . _userPresetsFileExists = exists , referencedFiles ) ;
211
211
212
212
// reset all expanded presets storage.
213
- this . _referencedFiles = Array . from ( referencedFiles ) ;
213
+ this . _referencedFiles = Array . from ( referencedFiles . keys ( ) ) ;
214
214
215
215
this . project . minCMakeVersion = preset . minCMakeVersion ( this . folderPath ) ;
216
216
@@ -837,24 +837,31 @@ export class PresetsController implements vscode.Disposable {
837
837
return chosenPresets ?. preset ;
838
838
}
839
839
840
+ // For all of the `getAll` methods, we now can safely grab only the user presets (if present), because they inherently include
841
+ // the presets.
840
842
async getAllConfigurePresets ( ) : Promise < preset . ConfigurePreset [ ] > {
841
- return preset . configurePresets ( this . folderPath ) . concat ( preset . userConfigurePresets ( this . folderPath ) ) ;
843
+ const userPresets = preset . userConfigurePresets ( this . folderPath ) ;
844
+ return userPresets . length > 0 ? userPresets : preset . configurePresets ( this . folderPath ) ;
842
845
}
843
846
844
847
async getAllBuildPresets ( ) : Promise < preset . BuildPreset [ ] > {
845
- return preset . buildPresets ( this . folderPath ) . concat ( preset . userBuildPresets ( this . folderPath ) ) ;
848
+ const userPresets = preset . userBuildPresets ( this . folderPath ) ;
849
+ return userPresets . length > 0 ? userPresets : preset . buildPresets ( this . folderPath ) ;
846
850
}
847
851
848
852
async getAllTestPresets ( ) : Promise < preset . TestPreset [ ] > {
849
- return preset . testPresets ( this . folderPath ) . concat ( preset . userTestPresets ( this . folderPath ) ) ;
853
+ const userPresets = preset . userTestPresets ( this . folderPath ) ;
854
+ return userPresets . length > 0 ? userPresets : preset . testPresets ( this . folderPath ) ;
850
855
}
851
856
852
857
async getAllPackagePresets ( ) : Promise < preset . PackagePreset [ ] > {
853
- return preset . packagePresets ( this . folderPath ) . concat ( preset . userPackagePresets ( this . folderPath ) ) ;
858
+ const userPresets = preset . userPackagePresets ( this . folderPath ) ;
859
+ return userPresets . length > 0 ? userPresets : preset . packagePresets ( this . folderPath ) ;
854
860
}
855
861
856
862
async getAllWorkflowPresets ( ) : Promise < preset . WorkflowPreset [ ] > {
857
- return preset . workflowPresets ( this . folderPath ) . concat ( preset . userWorkflowPresets ( this . folderPath ) ) ;
863
+ const userPresets = preset . userWorkflowPresets ( this . folderPath ) ;
864
+ return userPresets . length > 0 ? userPresets : preset . workflowPresets ( this . folderPath ) ;
858
865
}
859
866
860
867
async selectConfigurePreset ( quickStart ?: boolean ) : Promise < boolean > {
@@ -1594,8 +1601,28 @@ export class PresetsController implements vscode.Disposable {
1594
1601
setFile ( presetsFile . packagePresets ) ;
1595
1602
}
1596
1603
1597
- private async mergeIncludeFiles ( presetsFile : preset . PresetsFile | undefined , file : string , referencedFiles : Set < string > ) : Promise < void > {
1598
- if ( ! presetsFile || ! presetsFile . include ) {
1604
+ private async mergeIncludeFiles ( presetsFile : preset . PresetsFile | undefined , file : string , referencedFiles : Map < string , preset . PresetsFile | undefined > ) : Promise < void > {
1605
+ if ( ! presetsFile ) {
1606
+ return ;
1607
+ }
1608
+
1609
+ // CMakeUserPresets.json file should include CMakePresets.json file, by default.
1610
+ if ( this . presetsFileExist && file === this . userPresetsPath ) {
1611
+ presetsFile . include = presetsFile . include || [ ] ;
1612
+ const filteredIncludes = presetsFile . include . filter ( include => {
1613
+ // Ensuring that we handle expansions. Duplicated from loop below.
1614
+ const includePath = presetsFile . version >= 7 ?
1615
+ // Version 7 and later support $penv{} expansions in include paths
1616
+ substituteAll ( include , getParentEnvSubstitutions ( include , new Map < string , string > ( ) ) ) . result :
1617
+ include ;
1618
+ path . normalize ( path . resolve ( path . dirname ( file ) , includePath ) ) === this . presetsPath ;
1619
+ } ) ;
1620
+ if ( filteredIncludes . length === 0 ) {
1621
+ presetsFile . include . push ( this . presetsPath ) ;
1622
+ }
1623
+ }
1624
+
1625
+ if ( ! presetsFile . include ) {
1599
1626
return ;
1600
1627
}
1601
1628
@@ -1610,10 +1637,33 @@ export class PresetsController implements vscode.Disposable {
1610
1637
1611
1638
// Do not include files more than once
1612
1639
if ( referencedFiles . has ( fullIncludePath ) ) {
1640
+ const referencedIncludeFile = referencedFiles . get ( fullIncludePath ) ;
1641
+ if ( referencedIncludeFile ) {
1642
+ if ( referencedIncludeFile . configurePresets ) {
1643
+ presetsFile . configurePresets = lodash . unionWith ( referencedIncludeFile . configurePresets , presetsFile . configurePresets || [ ] , ( a , b ) => a . name === b . name ) ;
1644
+ }
1645
+ if ( referencedIncludeFile . buildPresets ) {
1646
+ presetsFile . buildPresets = lodash . unionWith ( referencedIncludeFile . buildPresets , presetsFile . buildPresets || [ ] , ( a , b ) => a . name === b . name ) ;
1647
+ }
1648
+ if ( referencedIncludeFile . testPresets ) {
1649
+ presetsFile . testPresets = lodash . unionWith ( referencedIncludeFile . testPresets , presetsFile . testPresets || [ ] , ( a , b ) => a . name === b . name ) ;
1650
+ }
1651
+ if ( referencedIncludeFile . packagePresets ) {
1652
+ presetsFile . packagePresets = lodash . unionWith ( referencedIncludeFile . packagePresets , presetsFile . packagePresets || [ ] , ( a , b ) => a . name === b . name ) ;
1653
+ }
1654
+ if ( referencedIncludeFile . workflowPresets ) {
1655
+ presetsFile . workflowPresets = lodash . unionWith ( referencedIncludeFile . workflowPresets , presetsFile . workflowPresets || [ ] , ( a , b ) => a . name === b . name ) ;
1656
+ }
1657
+ if ( referencedIncludeFile . cmakeMinimumRequired ) {
1658
+ if ( ! presetsFile . cmakeMinimumRequired || util . versionLess ( presetsFile . cmakeMinimumRequired , referencedIncludeFile . cmakeMinimumRequired ) ) {
1659
+ presetsFile . cmakeMinimumRequired = referencedIncludeFile . cmakeMinimumRequired ;
1660
+ }
1661
+ }
1662
+ }
1613
1663
continue ;
1614
1664
}
1615
1665
// Record the file as referenced, even if the file does not exist.
1616
- referencedFiles . add ( fullIncludePath ) ;
1666
+ referencedFiles . set ( fullIncludePath , undefined ) ;
1617
1667
1618
1668
const includeFileBuffer = await this . readPresetsFile ( fullIncludePath ) ;
1619
1669
if ( ! includeFileBuffer ) {
@@ -1622,6 +1672,7 @@ export class PresetsController implements vscode.Disposable {
1622
1672
}
1623
1673
1624
1674
let includeFile = await this . parsePresetsFile ( includeFileBuffer , fullIncludePath ) ;
1675
+ referencedFiles . set ( fullIncludePath , includeFile ) ;
1625
1676
includeFile = await this . validatePresetsFile ( includeFile , fullIncludePath ) ;
1626
1677
if ( ! includeFile ) {
1627
1678
continue ;
@@ -1634,19 +1685,19 @@ export class PresetsController implements vscode.Disposable {
1634
1685
await this . mergeIncludeFiles ( includeFile , fullIncludePath , referencedFiles ) ;
1635
1686
1636
1687
if ( includeFile . configurePresets ) {
1637
- presetsFile . configurePresets = includeFile . configurePresets . concat ( presetsFile . configurePresets || [ ] ) ;
1688
+ presetsFile . configurePresets = lodash . unionWith ( includeFile . configurePresets , presetsFile . configurePresets || [ ] , ( a , b ) => a . name === b . name ) ;
1638
1689
}
1639
1690
if ( includeFile . buildPresets ) {
1640
- presetsFile . buildPresets = includeFile . buildPresets . concat ( presetsFile . buildPresets || [ ] ) ;
1691
+ presetsFile . buildPresets = lodash . unionWith ( includeFile . buildPresets , presetsFile . buildPresets || [ ] , ( a , b ) => a . name === b . name ) ;
1641
1692
}
1642
1693
if ( includeFile . testPresets ) {
1643
- presetsFile . testPresets = includeFile . testPresets . concat ( presetsFile . testPresets || [ ] ) ;
1694
+ presetsFile . testPresets = lodash . unionWith ( includeFile . testPresets , presetsFile . testPresets || [ ] , ( a , b ) => a . name === b . name ) ;
1644
1695
}
1645
1696
if ( includeFile . packagePresets ) {
1646
- presetsFile . packagePresets = includeFile . packagePresets . concat ( presetsFile . packagePresets || [ ] ) ;
1697
+ presetsFile . packagePresets = lodash . unionWith ( includeFile . packagePresets , presetsFile . packagePresets || [ ] , ( a , b ) => a . name === b . name ) ;
1647
1698
}
1648
1699
if ( includeFile . workflowPresets ) {
1649
- presetsFile . workflowPresets = includeFile . workflowPresets . concat ( presetsFile . workflowPresets || [ ] ) ;
1700
+ presetsFile . workflowPresets = lodash . unionWith ( includeFile . workflowPresets , presetsFile . workflowPresets || [ ] , ( a , b ) => a . name === b . name ) ;
1650
1701
}
1651
1702
if ( includeFile . cmakeMinimumRequired ) {
1652
1703
if ( ! presetsFile . cmakeMinimumRequired || util . versionLess ( presetsFile . cmakeMinimumRequired , includeFile . cmakeMinimumRequired ) ) {
0 commit comments