Skip to content

Commit 8de4e03

Browse files
committed
Fix manifest ID returned for side-by-side workload manifests
1 parent e2aeac8 commit 8de4e03

File tree

9 files changed

+52
-42
lines changed

9 files changed

+52
-42
lines changed

src/Resolvers/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver/CachingWorkloadResolver.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ private static ResolutionResult Resolve(string sdkReferenceName, IWorkloadManife
139139
else if (sdkReferenceName.Equals("Microsoft.NET.SDK.WorkloadManifestTargetsLocator", StringComparison.OrdinalIgnoreCase))
140140
{
141141
List<string> workloadManifestPaths = new List<string>();
142-
foreach (var manifestDirectory in manifestProvider.GetManifestDirectories())
142+
foreach (var manifestDirectory in manifestProvider.GetManifests().Select(m => m.ManifestDirectory))
143143
{
144144
var workloadManifestTargetPath = Path.Combine(manifestDirectory, "WorkloadManifest.targets");
145145
if (File.Exists(workloadManifestTargetPath))

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@ public interface IWorkloadManifestProvider
1515
{
1616
IEnumerable<ReadableWorkloadManifest> GetManifests();
1717

18-
IEnumerable<string> GetManifestDirectories();
19-
2018
string GetSdkFeatureBand();
2119
}
2220
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,21 @@ namespace Microsoft.NET.Sdk.WorkloadManifestReader
1313
public class ReadableWorkloadManifest
1414
{
1515
public string ManifestId { get; }
16+
17+
public string ManifestDirectory { get; }
18+
1619
public string ManifestPath { get; }
1720

1821
readonly Func<Stream> _openManifestStreamFunc;
1922

2023

2124
readonly Func<Stream?> _openLocalizationStream;
2225

23-
public ReadableWorkloadManifest(string manifestId, string manifestPath, Func<Stream> openManifestStreamFunc, Func<Stream?> openLocalizationStream)
26+
public ReadableWorkloadManifest(string manifestId, string manifestDirectory, string manifestPath, Func<Stream> openManifestStreamFunc, Func<Stream?> openLocalizationStream)
2427
{
2528
ManifestId = manifestId;
2629
ManifestPath = manifestPath;
30+
ManifestDirectory = manifestDirectory;
2731
_openManifestStreamFunc = openManifestStreamFunc;
2832
_openLocalizationStream = openLocalizationStream;
2933
}

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

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -126,22 +126,6 @@ internal SdkDirectoryWorkloadManifestProvider(string sdkRootPath, string sdkVers
126126
}
127127

128128
public IEnumerable<ReadableWorkloadManifest> GetManifests()
129-
{
130-
foreach (var workloadManifestDirectory in GetManifestDirectories())
131-
{
132-
var workloadManifestPath = Path.Combine(workloadManifestDirectory, "WorkloadManifest.json");
133-
var id = Path.GetFileName(workloadManifestDirectory);
134-
135-
yield return new(
136-
id,
137-
workloadManifestPath,
138-
() => File.OpenRead(workloadManifestPath),
139-
() => WorkloadManifestReader.TryOpenLocalizationCatalogForManifest(workloadManifestPath)
140-
);
141-
}
142-
}
143-
144-
public IEnumerable<string> GetManifestDirectories()
145129
{
146130
// Scan manifest directories
147131
var manifestIdsToDirectories = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
@@ -245,7 +229,19 @@ void ProbeDirectory(string manifestDirectory)
245229
return int.MaxValue;
246230
})
247231
.ThenBy(kvp => kvp.Key, StringComparer.OrdinalIgnoreCase)
248-
.Select(kvp => kvp.Value)
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+
})
249245
.ToList();
250246
}
251247

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public IEnumerable<ReadableWorkloadManifest>
3535

3636
yield return new(
3737
manifestId,
38+
workloadManifestDirectory,
3839
workloadManifestPath,
3940
() => File.OpenRead(workloadManifestPath),
4041
() => WorkloadManifestReader.TryOpenLocalizationCatalogForManifest(workloadManifestPath)

src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/FakeManifestProvider.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public IEnumerable<ReadableWorkloadManifest> GetManifests()
3434
{
3535
yield return new(
3636
Path.GetFileNameWithoutExtension(filePath.manifest),
37+
Path.GetDirectoryName(filePath.manifest)!,
3738
filePath.manifest,
3839
() => new FileStream(filePath.manifest, FileMode.Open, FileAccess.Read),
3940
() => filePath.localizationCatalog != null ? new FileStream(filePath.localizationCatalog, FileMode.Open, FileAccess.Read) : null
@@ -54,6 +55,7 @@ internal class InMemoryFakeManifestProvider : IWorkloadManifestProvider, IEnumer
5455
public IEnumerable<ReadableWorkloadManifest> GetManifests()
5556
=> _manifests.Select(m => new ReadableWorkloadManifest(
5657
m.id,
58+
$@"C:\fake\{m.id}",
5759
$@"C:\fake\{m.id}\WorkloadManifest.json",
5860
(Func<Stream>)(() => new MemoryStream(m.content)),
5961
(Func<Stream?>)(() => null)

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

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -925,19 +925,19 @@ public void ItShouldReturnManifestsFromTestHook()
925925

926926
// Manifest in test hook directory
927927
Directory.CreateDirectory(Path.Combine(additionalManifestDirectory, sdkVersion, "Android"));
928-
File.WriteAllText(Path.Combine(additionalManifestDirectory, sdkVersion, "Android", "WorkloadManifest.json"), "AndroidContent");
928+
File.WriteAllText(Path.Combine(additionalManifestDirectory, sdkVersion, "Android", "WorkloadManifest.json"), "Android: AndroidContent");
929929

930930
// Manifest in default directory
931931
Directory.CreateDirectory(Path.Combine(_manifestVersionBandDirectory, "iOS"));
932-
File.WriteAllText(Path.Combine(_manifestVersionBandDirectory, "iOS", "WorkloadManifest.json"), "iOSContent");
932+
File.WriteAllText(Path.Combine(_manifestVersionBandDirectory, "iOS", "WorkloadManifest.json"), "iOS: iOSContent");
933933

934934

935935
var sdkDirectoryWorkloadManifestProvider
936936
= new SdkDirectoryWorkloadManifestProvider(sdkRootPath: _fakeDotnetRootDirectory, sdkVersion: sdkVersion, environmentMock.GetEnvironmentVariable, userProfileDir: null);
937937

938938
GetManifestContents(sdkDirectoryWorkloadManifestProvider)
939939
.Should()
940-
.BeEquivalentTo("AndroidContent", "iOSContent");
940+
.BeEquivalentTo("Android: AndroidContent", "iOS: iOSContent");
941941
}
942942

943943
[Fact]
@@ -955,18 +955,18 @@ public void ManifestFromTestHookShouldOverrideDefault()
955955

956956
// Manifest in test hook directory
957957
Directory.CreateDirectory(Path.Combine(additionalManifestDirectory, sdkVersion, "Android"));
958-
File.WriteAllText(Path.Combine(additionalManifestDirectory, sdkVersion, "Android", "WorkloadManifest.json"), "OverridingAndroidContent");
958+
File.WriteAllText(Path.Combine(additionalManifestDirectory, sdkVersion, "Android", "WorkloadManifest.json"), "Android: OverridingAndroidContent");
959959

960960
// Manifest in default directory
961961
Directory.CreateDirectory(Path.Combine(_manifestVersionBandDirectory, "Android"));
962-
File.WriteAllText(Path.Combine(_manifestVersionBandDirectory, "Android", "WorkloadManifest.json"), "OverriddenAndroidContent");
962+
File.WriteAllText(Path.Combine(_manifestVersionBandDirectory, "Android", "WorkloadManifest.json"), "Android: OverriddenAndroidContent");
963963

964964
var sdkDirectoryWorkloadManifestProvider
965965
= new SdkDirectoryWorkloadManifestProvider(sdkRootPath: _fakeDotnetRootDirectory, sdkVersion: sdkVersion, environmentMock.GetEnvironmentVariable, userProfileDir: null);
966966

967967
GetManifestContents(sdkDirectoryWorkloadManifestProvider)
968968
.Should()
969-
.BeEquivalentTo("OverridingAndroidContent");
969+
.BeEquivalentTo("Android: OverridingAndroidContent");
970970

971971
}
972972

@@ -988,28 +988,28 @@ public void ItSupportsMultipleTestHookFolders()
988988

989989
// Manifests in default directory
990990
Directory.CreateDirectory(Path.Combine(_manifestVersionBandDirectory, "iOS"));
991-
File.WriteAllText(Path.Combine(_manifestVersionBandDirectory, "iOS", "WorkloadManifest.json"), "iOSContent");
991+
File.WriteAllText(Path.Combine(_manifestVersionBandDirectory, "iOS", "WorkloadManifest.json"), "iOS: iOSContent");
992992

993993
Directory.CreateDirectory(Path.Combine(_manifestVersionBandDirectory, "Android"));
994-
File.WriteAllText(Path.Combine(_manifestVersionBandDirectory, "Android", "WorkloadManifest.json"), "DefaultAndroidContent");
994+
File.WriteAllText(Path.Combine(_manifestVersionBandDirectory, "Android", "WorkloadManifest.json"), "Android: DefaultAndroidContent");
995995

996996
// Manifests in first additional directory
997997
Directory.CreateDirectory(Path.Combine(additionalManifestDirectory1, sdkVersion, "Android"));
998-
File.WriteAllText(Path.Combine(additionalManifestDirectory1, sdkVersion, "Android", "WorkloadManifest.json"), "AndroidContent1");
998+
File.WriteAllText(Path.Combine(additionalManifestDirectory1, sdkVersion, "Android", "WorkloadManifest.json"), "Android: AndroidContent1");
999999

10001000
// Manifests in second additional directory
10011001
Directory.CreateDirectory(Path.Combine(additionalManifestDirectory2, sdkVersion, "Android"));
1002-
File.WriteAllText(Path.Combine(additionalManifestDirectory2, sdkVersion, "Android", "WorkloadManifest.json"), "AndroidContent2");
1002+
File.WriteAllText(Path.Combine(additionalManifestDirectory2, sdkVersion, "Android", "WorkloadManifest.json"), "Android: AndroidContent2");
10031003

10041004
Directory.CreateDirectory(Path.Combine(additionalManifestDirectory2, sdkVersion, "Test"));
1005-
File.WriteAllText(Path.Combine(additionalManifestDirectory2, sdkVersion, "Test", "WorkloadManifest.json"), "TestContent2");
1005+
File.WriteAllText(Path.Combine(additionalManifestDirectory2, sdkVersion, "Test", "WorkloadManifest.json"), "Test: TestContent2");
10061006

10071007
var sdkDirectoryWorkloadManifestProvider
10081008
= new SdkDirectoryWorkloadManifestProvider(sdkRootPath: _fakeDotnetRootDirectory, sdkVersion: sdkVersion, environmentMock.GetEnvironmentVariable, userProfileDir: null);
10091009

10101010
GetManifestContents(sdkDirectoryWorkloadManifestProvider)
10111011
.Should()
1012-
.BeEquivalentTo("AndroidContent1", "iOSContent", "TestContent2");
1012+
.BeEquivalentTo("Android: AndroidContent1", "iOS: iOSContent", "Test: TestContent2");
10131013

10141014
}
10151015

@@ -1025,14 +1025,14 @@ public void IfTestHookFolderDoesNotExistItShouldBeIgnored()
10251025

10261026
// Manifest in default directory
10271027
Directory.CreateDirectory(Path.Combine(_manifestVersionBandDirectory, "Android"));
1028-
File.WriteAllText(Path.Combine(_manifestVersionBandDirectory, "Android", "WorkloadManifest.json"), "AndroidContent");
1028+
File.WriteAllText(Path.Combine(_manifestVersionBandDirectory, "Android", "WorkloadManifest.json"), "Android: AndroidContent");
10291029

10301030
var sdkDirectoryWorkloadManifestProvider
10311031
= new SdkDirectoryWorkloadManifestProvider(sdkRootPath: _fakeDotnetRootDirectory, sdkVersion: "5.0.100", environmentMock.GetEnvironmentVariable, userProfileDir: null);
10321032

10331033
GetManifestContents(sdkDirectoryWorkloadManifestProvider)
10341034
.Should()
1035-
.BeEquivalentTo("AndroidContent");
1035+
.BeEquivalentTo("Android: AndroidContent");
10361036

10371037
}
10381038

@@ -1042,16 +1042,16 @@ public void ItShouldIgnoreOutdatedManifestIds()
10421042
Initialize();
10431043

10441044
Directory.CreateDirectory(Path.Combine(_manifestVersionBandDirectory, "iOS"));
1045-
File.WriteAllText(Path.Combine(_manifestVersionBandDirectory, "iOS", "WorkloadManifest.json"), "iOSContent");
1045+
File.WriteAllText(Path.Combine(_manifestVersionBandDirectory, "iOS", "WorkloadManifest.json"), "iOS: iOSContent");
10461046
Directory.CreateDirectory(Path.Combine(_manifestVersionBandDirectory, "Microsoft.NET.Workload.Android"));
1047-
File.WriteAllText(Path.Combine(_manifestVersionBandDirectory, "Microsoft.NET.Workload.Android", "WorkloadManifest.json"), "iOSContent");
1047+
File.WriteAllText(Path.Combine(_manifestVersionBandDirectory, "Microsoft.NET.Workload.Android", "WorkloadManifest.json"), "Microsoft.NET.Workload.Android: AndroidContent");
10481048

10491049
var sdkDirectoryWorkloadManifestProvider
10501050
= new SdkDirectoryWorkloadManifestProvider(sdkRootPath: _fakeDotnetRootDirectory, sdkVersion: "5.0.100", userProfileDir: null, globalJsonPath: null);
10511051

10521052
GetManifestContents(sdkDirectoryWorkloadManifestProvider)
10531053
.Should()
1054-
.BeEquivalentTo("iOSContent");
1054+
.BeEquivalentTo("iOS: iOSContent");
10551055
}
10561056

10571057
[Fact]
@@ -1231,7 +1231,7 @@ public void ItShouldIgnoreManifestsNotFoundInFallback()
12311231
var manifestDirectory6 = Path.Combine(fakeDotnetRootDirectory, "sdk-manifests", "6.0.100");
12321232
Directory.CreateDirectory(manifestDirectory6);
12331233
Directory.CreateDirectory(Path.Combine(manifestDirectory6, "iOS"));
1234-
File.WriteAllText(Path.Combine(manifestDirectory6, "iOS", "WorkloadManifest.json"), "iOS-6.0.100");
1234+
File.WriteAllText(Path.Combine(manifestDirectory6, "iOS", "WorkloadManifest.json"), "iOS: iOS-6.0.100");
12351235

12361236
var knownWorkloadsFilePath = Path.Combine(fakeDotnetRootDirectory, "sdk", "6.0.100", "KnownWorkloadManifests.txt");
12371237
Directory.CreateDirectory(Path.GetDirectoryName(knownWorkloadsFilePath)!);
@@ -1242,13 +1242,21 @@ var sdkDirectoryWorkloadManifestProvider
12421242

12431243
GetManifestContents(sdkDirectoryWorkloadManifestProvider)
12441244
.Should()
1245-
.BeEquivalentTo("iOS-6.0.100");
1245+
.BeEquivalentTo("iOS: iOS-6.0.100");
12461246

12471247
}
12481248

12491249
private IEnumerable<string> GetManifestContents(SdkDirectoryWorkloadManifestProvider manifestProvider)
12501250
{
1251-
return manifestProvider.GetManifests().Select(manifest => new StreamReader(manifest.OpenManifestStream()).ReadToEnd());
1251+
return manifestProvider.GetManifests().Select(manifest =>
1252+
{
1253+
var contents = new StreamReader(manifest.OpenManifestStream()).ReadToEnd();
1254+
1255+
string manifestId = contents.Split(':')[0];
1256+
manifest.ManifestId.Should().Be(manifestId);
1257+
1258+
return contents;
1259+
});
12521260
}
12531261

12541262
private class EnvironmentMock

src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/WorkloadPackGroupTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public void TestGetManifestDirectories()
2727
{
2828
var manifestProvider = CreateManifestProvider();
2929

30-
var manifestDirectories = manifestProvider.GetManifestDirectories();
30+
var manifestDirectories = manifestProvider.GetManifests().Select(m => m.ManifestDirectory);
3131
foreach (var manifestDirectory in manifestDirectories)
3232
{
3333
Log.WriteLine(manifestDirectory);

src/Tests/dotnet-workload-install.Tests/MockManifestProvider.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public IEnumerable<ReadableWorkloadManifest> GetManifests()
4040
{
4141
yield return new(
4242
id,
43+
Path.GetDirectoryName(path),
4344
path,
4445
() => File.OpenRead(path),
4546
() => WorkloadManifestReader.TryOpenLocalizationCatalogForManifest(path)

0 commit comments

Comments
 (0)