Skip to content

Commit 7099ad0

Browse files
committed
Support loading workload sets from different feature bands
1 parent 0fc6a6e commit 7099ad0

File tree

2 files changed

+35
-7
lines changed

2 files changed

+35
-7
lines changed

src/Cli/dotnet/commands/dotnet-workload/install/WorkloadManifestUpdater.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ private IEnumerable<ManifestVersionUpdate> CalculateManifestRollbacks(IEnumerabl
264264
var (id, (version, band)) = manifest;
265265
var (installedVersion, installedBand) = GetInstalledManifestVersion(id);
266266
return new ManifestVersionUpdate(id, installedVersion, installedBand.ToString(), version, band.ToString());
267-
});
267+
}).ToList(); // Call ToList() so that GetInstalledManifestVersion call isn't delayed until the result is iterated over
268268
}
269269

270270
public async Task<IEnumerable<WorkloadDownload>> GetManifestPackageDownloadsAsync(bool includePreviews, SdkFeatureBand providedSdkFeatureBand, SdkFeatureBand installedSdkFeatureBand)

src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/SdkDirectoryWorkloadManifestProvider.cs

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,32 @@ public void RefreshWorkloadManifests()
124124
_useManifestsFromInstallState = true;
125125
var availableWorkloadSets = GetAvailableWorkloadSets();
126126

127+
bool TryGetWorkloadSet(string workloadSetVersion, out WorkloadSet? workloadSet)
128+
{
129+
if (availableWorkloadSets.TryGetValue(workloadSetVersion, out workloadSet))
130+
{
131+
return true;
132+
}
133+
134+
// Check to see if workload set is from a different feature band
135+
WorkloadSet.WorkloadSetVersionToWorkloadSetPackageVersion(workloadSetVersion, out SdkFeatureBand workloadSetFeatureBand);
136+
if (!workloadSetFeatureBand.Equals(_sdkVersionBand))
137+
{
138+
var featureBandWorkloadSets = GetAvailableWorkloadSets(workloadSetFeatureBand);
139+
if (featureBandWorkloadSets.TryGetValue(workloadSetVersion, out workloadSet))
140+
{
141+
return true;
142+
}
143+
}
144+
145+
workloadSet = null;
146+
return false;
147+
}
148+
127149
if (_workloadSetVersionFromConstructor != null)
128150
{
129151
_useManifestsFromInstallState = false;
130-
if (!availableWorkloadSets.TryGetValue(_workloadSetVersionFromConstructor, out _workloadSet))
152+
if (!TryGetWorkloadSet(_workloadSetVersionFromConstructor, out _workloadSet))
131153
{
132154
throw new FileNotFoundException(string.Format(Strings.WorkloadVersionNotFound, _workloadSetVersionFromConstructor));
133155
}
@@ -139,7 +161,7 @@ public void RefreshWorkloadManifests()
139161
if (_globalJsonWorkloadSetVersion != null)
140162
{
141163
_useManifestsFromInstallState = false;
142-
if (!availableWorkloadSets.TryGetValue(_globalJsonWorkloadSetVersion, out _workloadSet))
164+
if (!TryGetWorkloadSet(_globalJsonWorkloadSetVersion, out _workloadSet))
143165
{
144166
_exceptionToThrow = new FileNotFoundException(string.Format(Strings.WorkloadVersionFromGlobalJsonNotFound, _globalJsonWorkloadSetVersion, _globalJsonPathFromConstructor));
145167
return;
@@ -155,7 +177,7 @@ public void RefreshWorkloadManifests()
155177
var installState = InstallStateContents.FromPath(installStateFilePath);
156178
if (!string.IsNullOrEmpty(installState.WorkloadVersion))
157179
{
158-
if (!availableWorkloadSets.TryGetValue(installState.WorkloadVersion!, out _workloadSet))
180+
if (!TryGetWorkloadSet(installState.WorkloadVersion!, out _workloadSet))
159181
{
160182
throw new FileNotFoundException(string.Format(Strings.WorkloadVersionFromInstallStateNotFound, installState.WorkloadVersion, installStateFilePath));
161183
}
@@ -446,18 +468,24 @@ void ProbeDirectory(string manifestDirectory, string featureBand)
446468
/// </summary>
447469
public Dictionary<string, WorkloadSet> GetAvailableWorkloadSets()
448470
{
471+
return GetAvailableWorkloadSets(_sdkVersionBand);
472+
}
473+
474+
public Dictionary<string, WorkloadSet> GetAvailableWorkloadSets(SdkFeatureBand workloadSetFeatureBand)
475+
{
476+
// How to deal with cross-band workload sets?
449477
Dictionary<string, WorkloadSet> availableWorkloadSets = new Dictionary<string, WorkloadSet>();
450478

451479
foreach (var manifestRoot in _manifestRoots.Reverse())
452480
{
453-
// Workload sets must match the SDK feature band, we don't support any fallback to a previous band
454-
var workloadSetsRoot = Path.Combine(manifestRoot, _sdkVersionBand.ToString(), WorkloadSetsFolderName);
481+
// We don't automatically fall back to a previous band
482+
var workloadSetsRoot = Path.Combine(manifestRoot, workloadSetFeatureBand.ToString(), WorkloadSetsFolderName);
455483
if (Directory.Exists(workloadSetsRoot))
456484
{
457485
foreach (var workloadSetDirectory in Directory.GetDirectories(workloadSetsRoot))
458486
{
459487
var workloadSetVersion = Path.GetFileName(workloadSetDirectory);
460-
var workloadSet = WorkloadSet.FromWorkloadSetFolder(workloadSetDirectory, workloadSetVersion, _sdkVersionBand);
488+
var workloadSet = WorkloadSet.FromWorkloadSetFolder(workloadSetDirectory, workloadSetVersion, workloadSetFeatureBand);
461489
availableWorkloadSets[workloadSet.Version!] = workloadSet;
462490
}
463491
}

0 commit comments

Comments
 (0)