Skip to content

Commit 296a001

Browse files
authored
Forward port 41996 (#42315)
2 parents 7dd99f8 + d66780b commit 296a001

File tree

2 files changed

+61
-14
lines changed

2 files changed

+61
-14
lines changed

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

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -181,31 +181,28 @@ bool TryGetWorkloadSet(string workloadSetVersion, out WorkloadSet? workloadSet)
181181
}
182182
}
183183

184+
_installStateFilePath = Path.Combine(WorkloadInstallType.GetInstallStateFolder(_sdkVersionBand, _sdkOrUserLocalPath), "default.json");
185+
var installState = InstallStateContents.FromPath(_installStateFilePath);
184186
if (workloadSet is null)
185187
{
186-
var installStateFilePath = Path.Combine(WorkloadInstallType.GetInstallStateFolder(_sdkVersionBand, _sdkOrUserLocalPath), "default.json");
187-
if (File.Exists(installStateFilePath))
188+
if (!string.IsNullOrEmpty(installState.WorkloadVersion))
188189
{
189-
var installState = InstallStateContents.FromPath(installStateFilePath);
190-
if (!string.IsNullOrEmpty(installState.WorkloadVersion))
190+
if (!TryGetWorkloadSet(installState.WorkloadVersion!, out workloadSet))
191191
{
192-
if (!TryGetWorkloadSet(installState.WorkloadVersion!, out workloadSet))
193-
{
194-
throw new FileNotFoundException(string.Format(Strings.WorkloadVersionFromInstallStateNotFound, installState.WorkloadVersion, installStateFilePath));
195-
}
192+
throw new FileNotFoundException(string.Format(Strings.WorkloadVersionFromInstallStateNotFound, installState.WorkloadVersion, _installStateFilePath));
196193
}
197-
198-
// Note: It is possible here to have both a workload set and loose manifests listed in the install state. This might happen if there is a
199-
// third-party workload manifest installed that's not part of the workload set
200-
_manifestsFromInstallState = installState.Manifests is null ? null : WorkloadSet.FromDictionaryForJson(installState.Manifests!, _sdkVersionBand);
201-
_installStateFilePath = installStateFilePath;
202194
}
195+
196+
// Note: It is possible here to have both a workload set and loose manifests listed in the install state. This might happen if there is a
197+
// third-party workload manifest installed that's not part of the workload set
198+
_manifestsFromInstallState = installState.Manifests is null ? null : WorkloadSet.FromDictionaryForJson(installState.Manifests!, _sdkVersionBand);
203199
}
204200

205-
if (workloadSet == null && availableWorkloadSets.Any())
201+
if (workloadSet == null && installState.UseWorkloadSets == true && availableWorkloadSets.Any())
206202
{
207203
var maxWorkloadSetVersion = availableWorkloadSets.Keys.Aggregate((s1, s2) => VersionCompare(s1, s2) >= 0 ? s1 : s2);
208204
workloadSet = availableWorkloadSets[maxWorkloadSetVersion.ToString()];
205+
_useManifestsFromInstallState = false;
209206
}
210207

211208
_workloadSet = workloadSet;

test/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/SdkDirectoryWorkloadManifestProviderTests.cs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Diagnostics.CodeAnalysis;
55
using System.Runtime.CompilerServices;
66
using Microsoft.DotNet.Cli;
7+
using Microsoft.DotNet.Workloads.Workload;
78
using Microsoft.NET.Sdk.Localization;
89
using Microsoft.NET.Sdk.WorkloadManifestReader;
910

@@ -31,6 +32,40 @@ void Initialize(string featureBand = "5.0.100", [CallerMemberName] string? testN
3132
Directory.CreateDirectory(_manifestVersionBandDirectory);
3233
}
3334

35+
[Theory]
36+
[InlineData(true)]
37+
[InlineData(false)]
38+
public void ItShouldPrioritizeInstallStateOverWorkloadSetUnlessSpecified(bool preferWorkloadSet)
39+
{
40+
Initialize();
41+
42+
CreateMockManifest(_manifestRoot, "8.0.400", "ios", "11.0.2", true);
43+
CreateMockManifest(_manifestRoot, "8.0.400", "ios", "11.0.6", true);
44+
CreateMockWorkloadSet(_manifestRoot, "8.0.400", "8.0.400", @"
45+
{
46+
""ios"": ""11.0.2/8.0.400""
47+
}
48+
");
49+
50+
var installStateLocation = WorkloadInstallType.GetInstallStateFolder(new SdkFeatureBand("8.0.400"), Path.GetDirectoryName(_manifestRoot)!);
51+
var installStateFilePath = Path.Combine(installStateLocation, "default.json");
52+
var installState = InstallStateContents.FromPath(installStateFilePath);
53+
installState.UseWorkloadSets = preferWorkloadSet;
54+
installState.Manifests = new Dictionary<string, string>()
55+
{
56+
{ "ios", "11.0.6/8.0.400" }
57+
};
58+
Directory.CreateDirectory(installStateLocation);
59+
File.WriteAllText(installStateFilePath, installState.ToString());
60+
61+
var sdkDirectoryWorkloadManifestProvider
62+
= new SdkDirectoryWorkloadManifestProvider(sdkRootPath: _fakeDotnetRootDirectory, sdkVersion: "8.0.400", userProfileDir: null, globalJsonPath: null);
63+
64+
sdkDirectoryWorkloadManifestProvider.GetManifests().Single().ManifestVersion.Should().Be(preferWorkloadSet ? "11.0.2" : "11.0.6");
65+
66+
Directory.Delete(Path.Combine(_manifestRoot, "8.0.400"), recursive: true);
67+
}
68+
3469
[Theory]
3570
[InlineData(true)]
3671
[InlineData(false)]
@@ -418,6 +453,13 @@ public void WorkloadSetCanIncludeMultipleJsonFiles()
418453
CreateMockManifest(_manifestRoot, "8.0.200", "android", "33.0.2-rc.1", true);
419454
CreateMockManifest(_manifestRoot, "8.0.200", "android", "33.0.2", true);
420455

456+
// To prepare the resolver to work with workload sets, we need to specify 'workload sets' in the install state file.
457+
var installStateLocation = WorkloadInstallType.GetInstallStateFolder(new SdkFeatureBand("8.0.200"), Path.GetDirectoryName(_manifestRoot)!);
458+
var installStateFilePath = Path.Combine(installStateLocation, "default.json");
459+
var installState = InstallStateContents.FromPath(installStateFilePath);
460+
installState.UseWorkloadSets = true;
461+
Directory.CreateDirectory(installStateLocation);
462+
File.WriteAllText(installStateFilePath, installState.ToString());
421463

422464
var workloadSetDirectory = Path.Combine(_manifestRoot, "8.0.200", "workloadsets", "8.0.200");
423465
Directory.CreateDirectory(workloadSetDirectory);
@@ -1254,6 +1296,14 @@ private void CreateMockManifest(string manifestRoot, string featureBand, string
12541296

12551297
private void CreateMockWorkloadSet(string manifestRoot, string featureBand, string workloadSetVersion, string workloadSetContents)
12561298
{
1299+
// To prepare the resolver to work with workload sets, we need to specify 'workload sets' in the install state file.
1300+
var installStateLocation = WorkloadInstallType.GetInstallStateFolder(new SdkFeatureBand(featureBand), Path.GetDirectoryName(manifestRoot)!);
1301+
var installStateFilePath = Path.Combine(installStateLocation, "default.json");
1302+
var installState = InstallStateContents.FromPath(installStateFilePath);
1303+
installState.UseWorkloadSets = true;
1304+
Directory.CreateDirectory(installStateLocation);
1305+
File.WriteAllText(installStateFilePath, installState.ToString());
1306+
12571307
var workloadSetDirectory = Path.Combine(manifestRoot, featureBand, "workloadsets", workloadSetVersion);
12581308
if (!Directory.Exists(workloadSetDirectory))
12591309
{

0 commit comments

Comments
 (0)