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,28 +1,35 @@
using System.Xml.Linq;
using System.Net.Http.Headers;
using System.Xml.Linq;
namespace ChrisKaczor.ApplicationUpdate;
public class VersionInfo
{
private static readonly HttpClient HttpClient = new() { DefaultRequestHeaders = { UserAgent = { ProductInfoHeaderValue.Parse(UpdateCheck.ApplicationName) } } };
public Version? Version { get; set; }
public string? InstallFile { get; set; }
public DateTimeOffset? InstallCreated { get; set; }
public bool? Prerelease { get; set; }
public static async Task<VersionInfo?> Load(ServerType updateServerType, string server, string file)
public static async Task<VersionInfo?> Load(ServerType updateServerType, string url, string file, bool includePrerelease)
{
return updateServerType switch
{
ServerType.Generic => LoadFile(server, file),
ServerType.GitHub => await LoadGitHub(server),
ServerType.Generic => LoadFile(url, file, includePrerelease),
ServerType.GitHub => await LoadGitHub(url, includePrerelease),
_ => null
};
}
private static VersionInfo? LoadFile(string server, string file)
private static VersionInfo? LoadFile(string url, string file, bool includePrerelease)
{
try
{
var document = XDocument.Load(server + file);
if (includePrerelease)
throw new NotSupportedException("Prerelease not currently supported for generic server type");
var document = XDocument.Load(url + file);
var versionInformationElement = document.Element("versionInformation");
@@ -51,33 +58,26 @@ public class VersionInfo
}
}
private static async Task<VersionInfo?> LoadGitHub(string server)
private static async Task<VersionInfo?> LoadGitHub(string baseUrl, bool includePrerelease)
{
try
{
var httpClient = new HttpClient();
var versionInfo = includePrerelease ? await GitHubRelease.GetLatestPrereleaseAsync(baseUrl) : await GitHubRelease.GetLatestAsync(baseUrl);
return versionInfo;
}
httpClient.DefaultRequestHeaders.UserAgent.ParseAdd(UpdateCheck.ApplicationName);
var json = await httpClient.GetStringAsync(server);
var release = GitHubRelease.FromJson(json);
if (release?.TagName == null || release.Assets == null || release.Assets.Count == 0)
return null;
var versionInfo = new VersionInfo
{
Version = Version.Parse(release.TagName),
InstallFile = release.Assets[0].BrowserDownloadUrl,
InstallCreated = release.Assets[0].CreatedAt?.UtcDateTime
};
return versionInfo;
}
catch (Exception)
{
internal static VersionInfo? CreateFromGitHubRelease(GitHubRelease? release)
{
if (release?.TagName == null || release.Assets == null || release.Assets.Count == 0)
return null;
}
var versionInfo = new VersionInfo
{
Version = Version.Parse(release.TagName),
InstallFile = release.Assets[0].BrowserDownloadUrl,
InstallCreated = release.Assets[0].CreatedAt?.UtcDateTime,
Prerelease = release.Prerelease
};
return versionInfo;
}
}