|
@@ -7,66 +7,50 @@ using System.Net.Http.Json;
|
|
|
using System.Reflection;
|
|
|
using System.Text;
|
|
|
using System.Text.Json.Serialization;
|
|
|
-using System.Text.RegularExpressions;
|
|
|
using System.Threading;
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
-namespace FastGithub
|
|
|
+namespace FastGithub.Upgrade
|
|
|
{
|
|
|
/// <summary>
|
|
|
- /// 版本检查
|
|
|
+ /// 升级检查后台服务
|
|
|
/// </summary>
|
|
|
- sealed class VersionHostedService : IHostedService
|
|
|
+ sealed class UpgradeHostedService : IHostedService
|
|
|
{
|
|
|
- private readonly ILogger<VersionHostedService> logger;
|
|
|
+ private readonly ILogger<UpgradeHostedService> logger;
|
|
|
private const string DownloadPage = "https://gitee.com/jiulang/fast-github/releases";
|
|
|
private const string ReleasesUri = "https://gitee.com/api/v5/repos/jiulang/fast-github/releases?page=1&per_page=1&direction=desc";
|
|
|
|
|
|
- public VersionHostedService(ILogger<VersionHostedService> logger)
|
|
|
+ public UpgradeHostedService(ILogger<UpgradeHostedService> logger)
|
|
|
{
|
|
|
this.logger = logger;
|
|
|
}
|
|
|
|
|
|
- public Task StartAsync(CancellationToken cancellationToken)
|
|
|
- {
|
|
|
- return this.CheckVersionAsync(cancellationToken);
|
|
|
- }
|
|
|
-
|
|
|
- public Task StopAsync(CancellationToken cancellationToken)
|
|
|
- {
|
|
|
- return Task.CompletedTask;
|
|
|
- }
|
|
|
-
|
|
|
/// <summary>
|
|
|
- /// 检测新版本
|
|
|
+ /// 检测版本
|
|
|
/// </summary>
|
|
|
/// <param name="cancellationToken"></param>
|
|
|
/// <returns></returns>
|
|
|
- private async Task CheckVersionAsync(CancellationToken cancellationToken)
|
|
|
+ public async Task StartAsync(CancellationToken cancellationToken)
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
- var version = Assembly
|
|
|
- .GetEntryAssembly()?
|
|
|
- .GetCustomAttribute<AssemblyInformationalVersionAttribute>()?
|
|
|
- .InformationalVersion;
|
|
|
-
|
|
|
- if (version == null)
|
|
|
+ var currentVersion = GetCurrentVersion();
|
|
|
+ if (currentVersion == null)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- using var httpClient = new HttpClient();
|
|
|
- var releases = await httpClient.GetFromJsonAsync<Release[]>(ReleasesUri, cancellationToken);
|
|
|
- var lastRelease = releases?.FirstOrDefault();
|
|
|
+ var lastRelease = await GetLastedReleaseAsync(cancellationToken);
|
|
|
if (lastRelease == null)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if (VersionCompare(lastRelease.TagName, version) > 0)
|
|
|
+ var lastedVersion = ProductionVersion.Parse(lastRelease.TagName);
|
|
|
+ if (lastedVersion.CompareTo(currentVersion) > 0)
|
|
|
{
|
|
|
- this.logger.LogInformation($"您正在使用{version}版本{Environment.NewLine}请前往{DownloadPage}下载新版本");
|
|
|
+ this.logger.LogInformation($"您正在使用{currentVersion}版本{Environment.NewLine}请前往{DownloadPage}下载新版本");
|
|
|
this.logger.LogInformation(lastRelease.ToString());
|
|
|
}
|
|
|
}
|
|
@@ -76,45 +60,34 @@ namespace FastGithub
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ public Task StopAsync(CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ return Task.CompletedTask;
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
- /// 版本比较
|
|
|
+ /// 获取当前版本
|
|
|
/// </summary>
|
|
|
- /// <param name="x"></param>
|
|
|
- /// <param name="y"></param>
|
|
|
/// <returns></returns>
|
|
|
- private static int VersionCompare(string x, string y)
|
|
|
+ private static ProductionVersion? GetCurrentVersion()
|
|
|
{
|
|
|
- const string VERSION = @"^\d+\.(\d+.){0,2}\d+";
|
|
|
- var xVersion = Regex.Match(x, VERSION).Value;
|
|
|
- var yVersion = Regex.Match(y, VERSION).Value;
|
|
|
+ var version = Assembly
|
|
|
+ .GetEntryAssembly()?
|
|
|
+ .GetCustomAttribute<AssemblyInformationalVersionAttribute>()?
|
|
|
+ .InformationalVersion;
|
|
|
|
|
|
- var xSubVersion = x[xVersion.Length..];
|
|
|
- var ySubVersion = y[yVersion.Length..];
|
|
|
-
|
|
|
- var value = Version.Parse(xVersion).CompareTo(Version.Parse(yVersion));
|
|
|
- if (value == 0)
|
|
|
- {
|
|
|
- value = SubCompare(xSubVersion, ySubVersion);
|
|
|
- }
|
|
|
- return value;
|
|
|
-
|
|
|
- static int SubCompare(string subX, string subY)
|
|
|
- {
|
|
|
- if (subX.Length == 0 && subY.Length == 0)
|
|
|
- {
|
|
|
- return 0;
|
|
|
- }
|
|
|
- if (subX.Length == 0)
|
|
|
- {
|
|
|
- return 1;
|
|
|
- }
|
|
|
- if (subY.Length == 0)
|
|
|
- {
|
|
|
- return -1;
|
|
|
- }
|
|
|
+ return version == null ? null : ProductionVersion.Parse(version);
|
|
|
+ }
|
|
|
|
|
|
- return StringComparer.OrdinalIgnoreCase.Compare(subX, subY);
|
|
|
- }
|
|
|
+ /// <summary>
|
|
|
+ /// 获取最新发布
|
|
|
+ /// </summary>
|
|
|
+ /// <returns></returns>
|
|
|
+ private static async Task<Release?> GetLastedReleaseAsync(CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ using var httpClient = new HttpClient();
|
|
|
+ var releases = await httpClient.GetFromJsonAsync<Release[]>(ReleasesUri, cancellationToken);
|
|
|
+ return releases?.FirstOrDefault();
|
|
|
}
|
|
|
|
|
|
/// <summary>
|