From 6b2731e5e0aee07825b55d64beca6815dab6840e Mon Sep 17 00:00:00 2001 From: Dominion Date: Sun, 4 Jun 2023 09:30:19 -0400 Subject: [PATCH] Better guards against the flakiness of the GitHub releases API --- .../Utils/GitHub/GitHubService.cs | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/Tgstation.Server.Host/Utils/GitHub/GitHubService.cs b/src/Tgstation.Server.Host/Utils/GitHub/GitHubService.cs index 39e62c9fde..2000647d73 100644 --- a/src/Tgstation.Server.Host/Utils/GitHub/GitHubService.cs +++ b/src/Tgstation.Server.Host/Utils/GitHub/GitHubService.cs @@ -83,20 +83,33 @@ namespace Tgstation.Server.Host.Utils.GitHub logger.LogTrace("{totalReleases} total releases", allReleases.Count); var releases = allReleases - .Select(release => + .Where(release => { - if (!release.TagName.StartsWith(updatesConfiguration.GitTagPrefix, StringComparison.InvariantCulture)) - return null; + if (!release.PublishedAt.HasValue) + { + logger.LogDebug("Release tag without PublishedAt: {releaseTag}", release.TagName); + return false; + } + if (!release.TagName.StartsWith(updatesConfiguration.GitTagPrefix, StringComparison.InvariantCulture)) + return false; + + return true; + }) + .GroupBy(release => + { if (!Version.TryParse(release.TagName.Replace(updatesConfiguration.GitTagPrefix, String.Empty, StringComparison.Ordinal), out var version)) { logger.LogDebug("Unparsable release tag: {releaseTag}", release.TagName); return null; } - return Tuple.Create(version, release); + return version; }) - .Where(tuple => tuple != null) + .Where(grouping => grouping.Key != null) + + // GitHub can return the same result twice or some other nonsense + .Select(grouping => Tuple.Create(grouping.Key, grouping.OrderBy(x => x.PublishedAt.Value).First())) .ToDictionary(tuple => tuple.Item1, tuple => tuple.Item2); logger.LogTrace("{parsedReleases} parsed releases", releases.Count);