Skip to content

Commit

Permalink
Merge pull request #228 from unoplatform/dev/jela/multi-versions-check
Browse files Browse the repository at this point in the history
fix: Validate for pinned versions
  • Loading branch information
jeromelaban authored Jan 30, 2024
2 parents 34be764 + 5cd3996 commit 66e00bd
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 49 deletions.
127 changes: 82 additions & 45 deletions UnoCheck/DotNet/DotNetWorkloadManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
using System.Xml;
using Newtonsoft.Json.Linq;
using DotNetCheck.Models;
using Microsoft.Deployment.DotNet.Releases;

namespace DotNetCheck.DotNet
{
Expand Down Expand Up @@ -105,57 +106,93 @@ Dictionary<string, string> GetInstalledWorkloadManifestIdsAndVersions()
}

public IEnumerable<(string id, string version)> GetInstalledWorkloads()
{
var manifestProvider = new SdkDirectoryWorkloadManifestProvider(SdkRoot, SdkVersion, null, null);

var workloadResolver = WorkloadResolver.Create(manifestProvider, SdkRoot, SdkVersion, null);

foreach (var manifestInfo in manifestProvider.GetManifests())
{
var manifestProvider = new SdkDirectoryWorkloadManifestProvider(SdkRoot, SdkVersion, null, SdkDirectoryWorkloadManifestProvider.GetGlobalJsonPath(Environment.CurrentDirectory));

var workloadResolver = WorkloadResolver.Create(manifestProvider, SdkRoot, SdkVersion, null);

foreach (var manifestInfo in GetAllManifests(manifestProvider))
{
using (var manifestStream = manifestInfo.OpenManifestStream())
{
var m = WorkloadManifestReader.ReadWorkloadManifest(manifestInfo.ManifestId, manifestStream, manifestInfo.ManifestPath);

// Each workload manifest can have one or more workloads defined
foreach (var wl in m.Workloads)
{
if (wl.Value is WorkloadDefinition wd && !AreWorkloadPacksInstalled(wd, workloadResolver))
{
continue;
}

yield return (wl.Key.ToString(), m.Version);
}
}
}

bool AreWorkloadPacksInstalled(WorkloadDefinition workload, WorkloadResolver workloadResolver)
{
foreach (var packId in workload.Packs ?? Enumerable.Empty<WorkloadPackId>())
{
var pack = workloadResolver.TryGetPackInfo(packId);

if (pack != null)
{
var packInstalled =
pack.Kind switch
{
WorkloadPackKind.Library or WorkloadPackKind.Template => File.Exists(pack.Path),
_ => Directory.Exists(pack.Path)
};

if (!packInstalled)
{
return false;
}
}
}

return true;
}
}

private static IEnumerable<ReadableWorkloadManifest> GetAllManifests(SdkDirectoryWorkloadManifestProvider manifestProvider)
{
// Enumerate all workload versions, including those not latest for the current band
// as they may have been pinned in 8.0.101 and later. https://github.com/dotnet/sdk/issues/37958
foreach (var manifest in manifestProvider.GetManifests())
{
using (var manifestStream = manifestInfo.OpenManifestStream())
{
var m = WorkloadManifestReader.ReadWorkloadManifest(manifestInfo.ManifestId, manifestStream, manifestInfo.ManifestPath);
var parentDirectory = Path.GetDirectoryName(manifest.ManifestDirectory);

// Each workload manifest can have one or more workloads defined
foreach (var wl in m.Workloads)
var manifestVersionDirectories = Directory.GetDirectories(parentDirectory)
.Where(dir => File.Exists(Path.Combine(dir, "WorkloadManifest.json")))
.Select(dir =>
{
if (wl.Value is WorkloadDefinition wd && !AreWorkloadPacksInstalled(wd, workloadResolver))
{
continue;
}

yield return (wl.Key.ToString(), m.Version);
}
}
}

bool AreWorkloadPacksInstalled(WorkloadDefinition workload, WorkloadResolver workloadResolver)
{
foreach (var packId in workload.Packs ?? Enumerable.Empty<WorkloadPackId>())
ReleaseVersion.TryParse(Path.GetFileName(dir), out var releaseVersion);
return (directory: dir, version: releaseVersion);
})
.Where(t => t.version != null)
.OrderByDescending(t => t.version)
.ToList();

foreach(var otherManifest in manifestVersionDirectories)
{
var pack = workloadResolver.TryGetPackInfo(packId);

if (pack != null)
{
var packInstalled =
pack.Kind switch
{
WorkloadPackKind.Library or WorkloadPackKind.Template => File.Exists(pack.Path),
_ => Directory.Exists(pack.Path)
};

if (!packInstalled)
{
return false;
}
}
}

return true;
var workloadManifestPath = Path.Combine(otherManifest.directory, "WorkloadManifest.json");

var readableManifest = new ReadableWorkloadManifest(
manifest.ManifestId,
otherManifest.directory,
workloadManifestPath,
manifestProvider.GetSdkFeatureBand(),
() => File.OpenRead(workloadManifestPath),
() => WorkloadManifestReader.TryOpenLocalizationCatalogForManifest(workloadManifestPath));

yield return readableManifest;
}
}
}
}

void RemoveOldMetadata()
void RemoveOldMetadata()
{
var dir = GetInstalledWorkloadMetadataDir();

Expand Down
6 changes: 3 additions & 3 deletions UnoCheck/Manifest/Manifest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ namespace DotNetCheck.Manifest
{
public partial class Manifest
{
public const string DefaultManifestUrl = "https://raw.githubusercontent.com/unoplatform/uno.check/9c9b7412dc4643d905808643fca44269e6abe5a1/manifests/uno.ui.manifest.json";
public const string PreviewManifestUrl = "https://raw.githubusercontent.com/unoplatform/uno.check/9c9b7412dc4643d905808643fca44269e6abe5a1/manifests/uno.ui-preview.manifest.json";
public const string PreviewMajorManifestUrl = "https://raw.githubusercontent.com/unoplatform/uno.check/9c9b7412dc4643d905808643fca44269e6abe5a1/manifests/uno.ui-preview-major.manifest.json";
public const string DefaultManifestUrl = "https://raw.githubusercontent.com/unoplatform/uno.check/684e4c6fe682883f5b8fadb176d62910f2c0f428/manifests/uno.ui.manifest.json";
public const string PreviewManifestUrl = "https://raw.githubusercontent.com/unoplatform/uno.check/684e4c6fe682883f5b8fadb176d62910f2c0f428/manifests/uno.ui-preview.manifest.json";
public const string PreviewMajorManifestUrl = "https://raw.githubusercontent.com/unoplatform/uno.check/684e4c6fe682883f5b8fadb176d62910f2c0f428/manifests/uno.ui-preview-major.manifest.json";

public static Task<Manifest> FromFileOrUrl(string fileOrUrl)
{
Expand Down
2 changes: 1 addition & 1 deletion manifests/uno.ui.manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"toolVersion": "1.14.0",
"variables": {
"OPENJDK_VERSION": "11.0.20.1",
"DOTNET_SDK_VERSION": "8.0.100",
"DOTNET_SDK_VERSION": "8.0.101",
"MACCATALYST_SDK_VERSION": "17.0.8478/8.0.100",
"IOS_SDK_VERSION": "17.0.8478/8.0.100",
"MACOS_SDK_VERSION": "14.0.8478/8.0.100",
Expand Down

0 comments on commit 66e00bd

Please sign in to comment.