From c686a139d869486280fc44fff65465534d7367a5 Mon Sep 17 00:00:00 2001 From: "C. Augusto Proiete" Date: Sun, 20 Dec 2020 17:36:28 -0400 Subject: [PATCH 1/2] (GH-1294) Leverage AnalyzedPackageVersion when downloading add-in packages --- build.cake | 3 +-- nuget.cake | 54 +++++++++++++++++++++--------------------------------- 2 files changed, 22 insertions(+), 35 deletions(-) diff --git a/build.cake b/build.cake index b218b023ced..f2d4fb212d6 100644 --- a/build.cake +++ b/build.cake @@ -162,8 +162,7 @@ Task("GetExtensionPackages") context.DownloadPackages(extensionDir, extensionSpecs .Where(x => !string.IsNullOrEmpty(x.NuGet)) - .Select(x => x.NuGet) - .ToArray()); + .ToDictionary(e => e.NuGet, e => e.AnalyzedPackageVersion)); context.CalcSupportedCakeVersions(extensionDir, extensionSpecs diff --git a/nuget.cake b/nuget.cake index b75a282ff38..b07eababa38 100644 --- a/nuget.cake +++ b/nuget.cake @@ -1,5 +1,4 @@ #addin "nuget:https://api.nuget.org/v3/index.json?package=Polly&version=7.1.0" -#addin "nuget:https://api.nuget.org/v3/index.json?package=LitJson&version=0.13.0" #addin "nuget:https://api.nuget.org/v3/index.json??package=Cake.FileHelpers&version=3.3.0" #addin "nuget:https://api.nuget.org/v3/index.json?package=NuGet.Protocol&version=5.7.0" @@ -12,7 +11,7 @@ using NuGetRepository = NuGet.Protocol.Core.Types.Repository; using NuGet.Versioning; using Polly; -public static void DownloadPackages(this ICakeContext context, DirectoryPath extensionDir, string[] packageIds) +public static void DownloadPackages(this ICakeContext context, DirectoryPath extensionDir, IDictionary packageIdAndVersionLookup) { var retryPolicy = Policy .Handle() @@ -23,45 +22,36 @@ public static void DownloadPackages(this ICakeContext context, DirectoryPath ext using (var httpClient = new HttpClient()) { Parallel.ForEach( - packageIds, - packageId => retryPolicy.Execute( - () => context.DownloadPackage(extensionDir, httpClient, packageId) + packageIdAndVersionLookup, + packageIdAndVersion => retryPolicy.Execute( + () => context.DownloadPackage(extensionDir, httpClient, packageIdAndVersion) ) ); } } -public static void DownloadPackage(this ICakeContext context, DirectoryPath extensionDir, HttpClient httpClient, string packageId) +public static void DownloadPackage(this ICakeContext context, DirectoryPath extensionDir, HttpClient httpClient, KeyValuePair packageIdAndVersion) { - context.Information("[{0}] fetching meta data...", packageId); - var packageJson = httpClient.GetStringAsync($"https://api.nuget.org/v3/registration5-semver1/{packageId.ToLowerInvariant()}/index.json") - .GetAwaiter() - .GetResult(); - - var package = LitJson.JsonMapper.ToObject(packageJson); - - var packageInfo = ( - from packageItem in package?.items ?? Enumerable.Empty() - from item in packageItem.items ?? Enumerable.Empty() - where item?.catalogEntry?.listed ?? false - let version = item?.catalogEntry?.version - let nugetVersion = version is null ? null : NuGetVersion.Parse(version) - orderby !(nugetVersion?.IsPrerelease ?? false), nugetVersion - select new - { - id = packageId, - version = nugetVersion?.ToNormalizedString(), - isPrerelease = nugetVersion?.IsPrerelease, - item?.packageContent - } - ).LastOrDefault(); + var packageId = packageIdAndVersion.Key; + var packageVersion = packageIdAndVersion.Value; - context.Verbose("[{0}] found {1}...", packageId, packageInfo); + if (string.IsNullOrWhiteSpace(packageVersion)) + { + context.Warning($"[{{0}}] Skipping download of {packageId} - AnalyzedPackageVersion not specified in metadata", packageId); + return; + } + context.Information($"[{{0}}] Downloading NuGet package {packageId} v{packageVersion}...", packageId); - var packageDir = extensionDir.Combine($"{packageId}.{packageInfo.version}".ToLower()); + var packageIdLower = packageId.ToLowerInvariant(); + var packageVersionLower = packageVersion.ToLowerInvariant(); + var packageDownloadUrl = $"https://api.nuget.org/v3-flatcontainer/{packageIdLower}/{packageVersionLower}/{packageIdLower}.{packageVersionLower}.nupkg"; - using (var stream = httpClient.GetStreamAsync(packageInfo.packageContent).GetAwaiter().GetResult()) + context.Verbose($"[{{0}}] GET {packageDownloadUrl}", packageId); + + var packageDir = extensionDir.Combine($"{packageId}.{packageVersion}".ToLowerInvariant()); + + using (var stream = httpClient.GetStreamAsync(packageDownloadUrl).GetAwaiter().GetResult()) { using (var zipStream = new System.IO.Compression.ZipArchive(stream)) { @@ -103,8 +93,6 @@ public static void DownloadPackage(this ICakeContext context, DirectoryPath exte } } - context.FileWriteText(extensionDir.CombineWithFilePath($"{packageId}.isprerelease"), packageInfo.isPrerelease.GetValueOrDefault().ToString()); - context.Information("[{0}] done.", packageId); } From 9becebf696089752bf3c776252416b0586f10928 Mon Sep 17 00:00:00 2001 From: "C. Augusto Proiete" Date: Sun, 20 Dec 2020 17:50:38 -0400 Subject: [PATCH 2/2] (GH-1294) Leverage AnalyzedPackageIsPrerelease from add-in metadata --- config.wyam | 6 ------ input/_UsageAddin.cshtml | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/config.wyam b/config.wyam index 453073345cf..c5a524e1441 100644 --- a/config.wyam +++ b/config.wyam @@ -19,12 +19,6 @@ Settings[DocsKeys.BlogRssPath] = "blog/feed/rss/index.xml"; Pipelines.InsertBefore(Docs.Code, "Extensions", ReadFiles("../extensions/*.yml"), Yaml(), - Meta( - "IsPrerelease", - FileSystem.GetInputFile($"../release/extensions/{@doc.String("NuGet")}.isprerelease").Exists - ? bool.Parse(FileSystem.GetInputFile($"../release/extensions/{@doc.String("NuGet")}.isprerelease").ReadAllText()) - : false - ), Meta( "SupportedCakeVersions", FileSystem.GetInputFile($"../release/extensions/{@doc.String("NuGet")}.supportedcakeversions").Exists diff --git a/input/_UsageAddin.cshtml b/input/_UsageAddin.cshtml index 5b62db2b487..dc6a69d892b 100644 --- a/input/_UsageAddin.cshtml +++ b/input/_UsageAddin.cshtml @@ -3,7 +3,7 @@ @{ string nuget = Model.String("NuGet"); string version = Model.String("AnalyzedPackageVersion"); - bool isPrerelease = Model.Bool("isPrerelease"); + bool isPrerelease = Model.Bool("AnalyzedPackageIsPrerelease"); string preReleaseQueryParam = isPrerelease ? "&prerelease" : string.Empty; }