diff --git a/src/Velopack.Packaging/BuildAssets.cs b/src/Velopack.Packaging/BuildAssets.cs index dc1b8f15..74fbbb24 100644 --- a/src/Velopack.Packaging/BuildAssets.cs +++ b/src/Velopack.Packaging/BuildAssets.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Text; using System.Text.Json; using System.Threading.Tasks; +using Velopack.Json; using Velopack.Packaging.Exceptions; namespace Velopack.Packaging @@ -19,19 +20,13 @@ namespace Velopack.Packaging .ToList(); } - private static readonly JsonSerializerOptions _options = new JsonSerializerOptions { - AllowTrailingCommas = true, - WriteIndented = true, - ReadCommentHandling = JsonCommentHandling.Skip, - }; - public static void Write(string outputDir, string channel, IEnumerable files) { var assets = new BuildAssets { Files = files.OrderBy(f => f).ToList(), }; var path = Path.Combine(outputDir, $"assets.{channel}.json"); - var json = JsonSerializer.Serialize(assets, _options); + var json = JsonSerializer.Serialize(assets, SimpleJson.Options); File.WriteAllText(path, json); } @@ -42,7 +37,7 @@ namespace Velopack.Packaging throw new UserInfoException($"Could not find assets file for channel '{channel}' (looking for '{Path.GetFileName(path)}' in directory '{outputDir}'). " + $"If you've just created a Velopack release, verify you're calling this command with the same '--channel' as you did with 'pack'."); } - return JsonSerializer.Deserialize(File.ReadAllText(path), _options); + return JsonSerializer.Deserialize(File.ReadAllText(path), SimpleJson.Options); } } } diff --git a/src/Velopack.Packaging/PackageBuilder.cs b/src/Velopack.Packaging/PackageBuilder.cs index 0d07fb37..bacee744 100644 --- a/src/Velopack.Packaging/PackageBuilder.cs +++ b/src/Velopack.Packaging/PackageBuilder.cs @@ -174,7 +174,7 @@ namespace Velopack.Packaging File.Move(f.from, f.to, true); } - ReleaseEntryHelper.UpdateReleaseFiles(releaseDir.FullName); + ReleaseEntryHelper.UpdateReleaseFiles(releaseDir.FullName, Log); BuildAssets.Write(releaseDir.FullName, channel, filesToCopy.Select(x => x.to)); progress(100); return Task.CompletedTask; diff --git a/src/Velopack.Packaging/ReleaseEntryHelper.cs b/src/Velopack.Packaging/ReleaseEntryHelper.cs index 074b3119..0ec70287 100644 --- a/src/Velopack.Packaging/ReleaseEntryHelper.cs +++ b/src/Velopack.Packaging/ReleaseEntryHelper.cs @@ -3,6 +3,7 @@ using System.Text.Json.Serialization; using System.Text.RegularExpressions; using Microsoft.Extensions.Logging; using NuGet.Versioning; +using Velopack.Json; using Velopack.NuGet; using Velopack.Packaging.Exceptions; using Velopack.Sources; @@ -90,7 +91,7 @@ namespace Velopack.Packaging return assets; } - public static void UpdateReleaseFiles(string outputDir) + public static void UpdateReleaseFiles(string outputDir, ILogger log) { var releases = GetReleasesFromDir(outputDir); foreach (var releaseFile in Directory.EnumerateFiles(outputDir, "RELEASES*")) { @@ -98,10 +99,16 @@ namespace Velopack.Packaging } foreach (var kvp in releases) { if (VelopackRuntimeInfo.IsWindows && kvp.Key == GetDefaultChannel(RuntimeOs.Windows)) { + var exclude = kvp.Value.Where(x => x.Version.ReleaseLabels.Any(r => r.Contains('.')) || x.Version.HasMetadata).ToArray(); + if (exclude.Any()) { + log.Warn($"Excluding {exclude.Length} assets from legacy RELEASES file, because they " + + $"contain an invalid character in the version: {string.Join(", ", exclude.Select(x => x.FileName))}"); + } + // We write a legacy RELEASES file to allow older applications to update to velopack #pragma warning disable CS0618 // Type or member is obsolete var path = Path.Combine(outputDir, "RELEASES"); - ReleaseEntry.WriteReleaseFile(kvp.Value.Select(ReleaseEntry.FromVelopackAsset), path); + ReleaseEntry.WriteReleaseFile(kvp.Value.Except(exclude).Select(ReleaseEntry.FromVelopackAsset), path); #pragma warning restore CS0618 // Type or member is obsolete } var indexPath = Path.Combine(outputDir, Utility.GetVeloReleaseIndexName(kvp.Key)); @@ -119,18 +126,13 @@ namespace Velopack.Packaging public static string GetAssetFeedJson(VelopackAssetFeed feed) { - return JsonSerializer.Serialize(feed, new JsonSerializerOptions() { - WriteIndented = true, - DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, - Converters = { - new JsonStringEnumConverter(), - }, - }); + return JsonSerializer.Serialize(feed, SimpleJson.Options); } public static string GetSuggestedReleaseName(string id, string version, string channel, bool delta) { var suffix = GetUniqueAssetSuffix(channel); + version = SemanticVersion.Parse(version).ToNormalizedString(); if (VelopackRuntimeInfo.IsWindows && channel == GetDefaultChannel(RuntimeOs.Windows)) { return $"{id}-{version}{(delta ? "-delta" : "-full")}.nupkg"; } diff --git a/src/Velopack/Internal/SimpleJson.cs b/src/Velopack/Internal/SimpleJson.cs index 2b920224..160108ab 100644 --- a/src/Velopack/Internal/SimpleJson.cs +++ b/src/Velopack/Internal/SimpleJson.cs @@ -1,14 +1,13 @@ using System; using NuGet.Versioning; -using System.Text.Json.Serialization; #if NET5_0_OR_GREATER using System.Text.Json; +using System.Text.Json.Serialization; #else using System.Reflection; using Newtonsoft.Json; using Newtonsoft.Json.Converters; -using Newtonsoft.Json.Linq; using Newtonsoft.Json.Serialization; #endif @@ -30,6 +29,8 @@ namespace Velopack.Json AllowTrailingCommas = true, ReadCommentHandling = JsonCommentHandling.Skip, PropertyNameCaseInsensitive = true, + WriteIndented = true, + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, Converters = { new JsonStringEnumConverter(), new SemanticVersionConverter() }, };