@@ -128,14 +128,29 @@ internal SdkDirectoryWorkloadManifestProvider(string sdkRootPath, string sdkVers
128128 public IEnumerable < ReadableWorkloadManifest > GetManifests ( )
129129 {
130130 // Scan manifest directories
131- var manifestIdsToDirectories = new Dictionary < string , string > ( StringComparer . OrdinalIgnoreCase ) ;
131+ var manifestIdsToManifests = new Dictionary < string , ReadableWorkloadManifest > ( StringComparer . OrdinalIgnoreCase ) ;
132132
133- void ProbeDirectory ( string manifestDirectory )
133+ void AddManifest ( string manifestId , string manifestDirectory , string featureBand )
134+ {
135+ var workloadManifestPath = Path . Combine ( manifestDirectory , "WorkloadManifest.json" ) ;
136+
137+ var readableManifest = new ReadableWorkloadManifest (
138+ manifestId ,
139+ manifestDirectory ,
140+ workloadManifestPath ,
141+ featureBand ,
142+ ( ) => File . OpenRead ( workloadManifestPath ) ,
143+ ( ) => WorkloadManifestReader . TryOpenLocalizationCatalogForManifest ( workloadManifestPath ) ) ;
144+
145+ manifestIdsToManifests [ manifestId ] = readableManifest ;
146+ }
147+
148+ void ProbeDirectory ( string manifestDirectory , string featureBand )
134149 {
135150 ( string ? id , string ? finalManifestDirectory ) = ResolveManifestDirectory ( manifestDirectory ) ;
136151 if ( id != null && finalManifestDirectory != null )
137152 {
138- manifestIdsToDirectories . Add ( id , finalManifestDirectory ) ;
153+ AddManifest ( id , finalManifestDirectory , featureBand ) ;
139154 }
140155 }
141156
@@ -147,7 +162,7 @@ void ProbeDirectory(string manifestDirectory)
147162 {
148163 foreach ( var workloadManifestDirectory in Directory . EnumerateDirectories ( manifestVersionBandDirectory ) )
149164 {
150- ProbeDirectory ( workloadManifestDirectory ) ;
165+ ProbeDirectory ( workloadManifestDirectory , _sdkVersionBand . ToString ( ) ) ;
151166 }
152167 }
153168 }
@@ -169,7 +184,7 @@ void ProbeDirectory(string manifestDirectory)
169184
170185 foreach ( var workloadManifestDirectory in directoriesWithManifests . Values )
171186 {
172- ProbeDirectory ( workloadManifestDirectory ) ;
187+ ProbeDirectory ( workloadManifestDirectory , _sdkVersionBand . ToString ( ) ) ;
173188 }
174189 }
175190
@@ -184,7 +199,8 @@ void ProbeDirectory(string manifestDirectory)
184199 {
185200 throw new FileNotFoundException ( string . Format ( Strings . ManifestFromWorkloadSetNotFound , manifestSpecifier . ToString ( ) , _workloadSet . Version ) ) ;
186201 }
187- manifestIdsToDirectories [ kvp . Key . ToString ( ) ] = manifestDirectory ;
202+ AddManifest ( manifestSpecifier . Id . ToString ( ) , manifestDirectory , manifestSpecifier . FeatureBand . ToString ( ) ) ;
203+
188204 }
189205 }
190206
@@ -199,26 +215,26 @@ void ProbeDirectory(string manifestDirectory)
199215 {
200216 throw new FileNotFoundException ( string . Format ( Strings . ManifestFromInstallStateNotFound , manifestSpecifier . ToString ( ) , _installStateFilePath ) ) ;
201217 }
202- manifestIdsToDirectories [ kvp . Key . ToString ( ) ] = manifestDirectory ;
218+ AddManifest ( manifestSpecifier . Id . ToString ( ) , manifestDirectory , manifestSpecifier . FeatureBand . ToString ( ) ) ;
203219 }
204220 }
205221
206- if ( _knownManifestIdsAndOrder != null && _knownManifestIdsAndOrder . Keys . Any ( id => ! manifestIdsToDirectories . ContainsKey ( id ) ) )
222+ if ( _knownManifestIdsAndOrder != null && _knownManifestIdsAndOrder . Keys . Any ( id => ! manifestIdsToManifests . ContainsKey ( id ) ) )
207223 {
208- var missingManifestIds = _knownManifestIdsAndOrder . Keys . Where ( id => ! manifestIdsToDirectories . ContainsKey ( id ) ) ;
224+ var missingManifestIds = _knownManifestIdsAndOrder . Keys . Where ( id => ! manifestIdsToManifests . ContainsKey ( id ) ) ;
209225 foreach ( var missingManifestId in missingManifestIds )
210226 {
211- var manifestDir = FallbackForMissingManifest ( missingManifestId ) ;
227+ var ( manifestDir , featureBand ) = FallbackForMissingManifest ( missingManifestId ) ;
212228 if ( ! string . IsNullOrEmpty ( manifestDir ) )
213229 {
214- manifestIdsToDirectories . Add ( missingManifestId , manifestDir ) ;
230+ AddManifest ( missingManifestId , manifestDir , featureBand ) ;
215231 }
216232 }
217233 }
218234
219235 // Return manifests in a stable order. Manifests in the KnownWorkloadManifests.txt file will be first, and in the same order they appear in that file.
220236 // Then the rest of the manifests (if any) will be returned in (ordinal case-insensitive) alphabetical order.
221- return manifestIdsToDirectories
237+ return manifestIdsToManifests
222238 . OrderBy ( kvp =>
223239 {
224240 if ( _knownManifestIdsAndOrder != null &&
@@ -229,19 +245,7 @@ void ProbeDirectory(string manifestDirectory)
229245 return int . MaxValue ;
230246 } )
231247 . ThenBy ( kvp => kvp . Key , StringComparer . OrdinalIgnoreCase )
232- . Select ( kvp =>
233- {
234- var manifestId = kvp . Key ;
235- var manifestDirectory = kvp . Value ;
236- var workloadManifestPath = Path . Combine ( manifestDirectory , "WorkloadManifest.json" ) ;
237-
238- return new ReadableWorkloadManifest (
239- manifestId ,
240- manifestDirectory ,
241- workloadManifestPath ,
242- ( ) => File . OpenRead ( workloadManifestPath ) ,
243- ( ) => WorkloadManifestReader . TryOpenLocalizationCatalogForManifest ( workloadManifestPath ) ) ;
244- } )
248+ . Select ( kvp => kvp . Value )
245249 . ToList ( ) ;
246250 }
247251
@@ -282,21 +286,21 @@ void ProbeDirectory(string manifestDirectory)
282286 return ( null , null ) ;
283287 }
284288
285- private string FallbackForMissingManifest ( string manifestId )
289+ private ( string manifestDirectory , string manifestFeatureBand ) FallbackForMissingManifest ( string manifestId )
286290 {
287291 // Only use the last manifest root (usually the dotnet folder itself) for fallback
288292 var sdkManifestPath = _manifestRoots . Last ( ) ;
289293 if ( ! Directory . Exists ( sdkManifestPath ) )
290294 {
291- return string . Empty ;
295+ return ( string . Empty , string . Empty ) ;
292296 }
293297
294298 var candidateFeatureBands = Directory . GetDirectories ( sdkManifestPath )
295299 . Select ( dir => Path . GetFileName ( dir ) )
296300 . Select ( featureBand => new SdkFeatureBand ( featureBand ) )
297301 . Where ( featureBand => featureBand < _sdkVersionBand || _sdkVersionBand . ToStringWithoutPrerelease ( ) . Equals ( featureBand . ToString ( ) , StringComparison . Ordinal ) ) ;
298302
299- var matchingManifestFatureBandsAndResolvedManifestDirectories = candidateFeatureBands
303+ var matchingManifestFeatureBandsAndResolvedManifestDirectories = candidateFeatureBands
300304 // Calculate path to <FeatureBand>\<ManifestID>
301305 . Select ( featureBand => ( featureBand , manifestDirectory : Path . Combine ( sdkManifestPath , featureBand . ToString ( ) , manifestId ) ) )
302306 // Filter out directories that don't exist
@@ -307,14 +311,15 @@ private string FallbackForMissingManifest(string manifestId)
307311 . Where ( t => t . res . id != null && t . res . manifestDirectory != null )
308312 . ToList ( ) ;
309313
310- if ( matchingManifestFatureBandsAndResolvedManifestDirectories . Any ( ) )
314+ if ( matchingManifestFeatureBandsAndResolvedManifestDirectories . Any ( ) )
311315 {
312- return matchingManifestFatureBandsAndResolvedManifestDirectories . OrderByDescending ( t => t . featureBand ) . First ( ) . res . manifestDirectory ! ;
316+ var selectedFeatureBandAndManifestDirectory = matchingManifestFeatureBandsAndResolvedManifestDirectories . OrderByDescending ( t => t . featureBand ) . First ( ) ;
317+ return ( selectedFeatureBandAndManifestDirectory . res . manifestDirectory ! , selectedFeatureBandAndManifestDirectory . featureBand . ToString ( ) ) ;
313318 }
314319 else
315320 {
316321 // Manifest does not exist
317- return string . Empty ;
322+ return ( string . Empty , string . Empty ) ;
318323 }
319324 }
320325
0 commit comments