Add basic support for prerelease versions

This commit is contained in:
2025-09-24 16:49:10 -04:00
parent 4e824e2039
commit d2c7f27970
4 changed files with 104 additions and 48 deletions

View File

@@ -1,30 +1,84 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System.Globalization;
using System.Net.Http.Headers;
using System.Text.RegularExpressions;
namespace ChrisKaczor.ApplicationUpdate
{
public partial class GitHubRelease
{
[JsonProperty("tag_name")]
public string? TagName { get; set; }
private const string LatestSegment = "/latest";
[JsonProperty("assets")]
public List<Asset>? Assets { get; set; }
private static readonly HttpClient HttpClient = new()
{
DefaultRequestHeaders =
{ UserAgent = { ProductInfoHeaderValue.Parse(UpdateCheck.ApplicationName.Replace(" ", "")) } }
};
private static GitHubRelease? FromJson(string json) =>
JsonConvert.DeserializeObject<GitHubRelease>(json, Converter.Settings);
private static List<GitHubRelease>? FromJsonArray(string json) =>
JsonConvert.DeserializeObject<List<GitHubRelease>>(json, Converter.Settings);
[JsonProperty("tag_name")] public string? TagName { get; set; }
[JsonProperty("assets")] public List<Asset>? Assets { get; set; }
[JsonProperty("prerelease")] public bool Prerelease { get; set; }
public static async Task<VersionInfo?> GetLatestAsync(string baseUrl)
{
try
{
var url = baseUrl.EndsWith(LatestSegment) ? baseUrl : baseUrl + LatestSegment;
var json = await HttpClient.GetStringAsync(url);
var release = FromJson(json);
var versionInfo = VersionInfo.CreateFromGitHubRelease(release);
return versionInfo;
}
catch (Exception)
{
return null;
}
}
public static async Task<VersionInfo?> GetLatestPrereleaseAsync(string baseUrl)
{
try
{
var url = baseUrl.EndsWith(LatestSegment) ? baseUrl[..^LatestSegment.Length] : baseUrl;
var json = await HttpClient.GetStringAsync(url);
var releases = FromJsonArray(json);
var release = releases?.FirstOrDefault();
if (release == null)
return null;
var versionInfo = VersionInfo.CreateFromGitHubRelease(release);
return versionInfo;
}
catch (Exception)
{
return null;
}
}
}
public class Asset
{
[JsonProperty("created_at")]
public DateTimeOffset? CreatedAt { get; set; }
[JsonProperty("created_at")] public DateTimeOffset? CreatedAt { get; set; }
[JsonProperty("browser_download_url")]
public string? BrowserDownloadUrl { get; set; }
}
public partial class GitHubRelease
{
public static GitHubRelease? FromJson(string json) => JsonConvert.DeserializeObject<GitHubRelease>(json, Converter.Settings);
[JsonProperty("browser_download_url")] public string? BrowserDownloadUrl { get; set; }
}
internal class Converter