Compare commits
2 Commits
60a3ec4dc7
...
d4977a8708
| Author | SHA1 | Date | |
|---|---|---|---|
| d4977a8708 | |||
| 6a01813602 |
@@ -6,7 +6,7 @@ namespace ReleaseUpdater;
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Провайдер для получения информации о релизах из Github / Gitea API.
|
/// Провайдер для получения информации о релизах из Github / Gitea API.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public sealed class GiteaReleaseProvider
|
public sealed class ReleaseProvider
|
||||||
{
|
{
|
||||||
private static readonly JsonSerializerOptions JsonOpts = new(JsonSerializerDefaults.Web);
|
private static readonly JsonSerializerOptions JsonOpts = new(JsonSerializerDefaults.Web);
|
||||||
|
|
||||||
@@ -29,7 +29,7 @@ public static class ReleaseUpdaterFacade
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static async Task<IReadOnlyList<string>> GetVersionsAsync(string apiUrl, string? token = null)
|
public static async Task<IReadOnlyList<string>> GetVersionsAsync(string apiUrl, string? token = null)
|
||||||
{
|
{
|
||||||
var provider = new GiteaReleaseProvider();
|
var provider = new ReleaseProvider();
|
||||||
var releases = await provider.GetReleasesAsync(apiUrl, token);
|
var releases = await provider.GetReleasesAsync(apiUrl, token);
|
||||||
return releases.Select(r => r.TagName).ToList();
|
return releases.Select(r => r.TagName).ToList();
|
||||||
}
|
}
|
||||||
@@ -42,7 +42,7 @@ public static class ReleaseUpdaterFacade
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var provider = new GiteaReleaseProvider();
|
var provider = new ReleaseProvider();
|
||||||
var release = await provider.FindReleaseAsync(apiUrl, versionOrLatest, token)
|
var release = await provider.FindReleaseAsync(apiUrl, versionOrLatest, token)
|
||||||
?? throw new Exception("Release not found");
|
?? throw new Exception("Release not found");
|
||||||
|
|
||||||
@@ -72,11 +72,11 @@ public static class ReleaseUpdaterFacade
|
|||||||
/// Обновление через внешний Updater.exe.
|
/// Обновление через внешний Updater.exe.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static async Task UpdateWithExternalAsync(
|
public static async Task UpdateWithExternalAsync(
|
||||||
string apiUrl, string? token, string installPath, string appExe, string versionOrLatest = "latest", string? updaterExePath = null)
|
string apiUrl, string? token, string installPath, string appExe, string versionOrLatest = "latest", string? updaterExePath = null, bool exitCurrentApp = false)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var provider = new GiteaReleaseProvider();
|
var provider = new ReleaseProvider();
|
||||||
var release = await provider.FindReleaseAsync(apiUrl, versionOrLatest, token)
|
var release = await provider.FindReleaseAsync(apiUrl, versionOrLatest, token)
|
||||||
?? throw new Exception("Release not found");
|
?? throw new Exception("Release not found");
|
||||||
|
|
||||||
@@ -99,6 +99,8 @@ public static class ReleaseUpdaterFacade
|
|||||||
WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory
|
WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (exitCurrentApp) { Environment.Exit(0); }
|
||||||
|
|
||||||
process?.WaitForExit();
|
process?.WaitForExit();
|
||||||
|
|
||||||
if (process?.ExitCode == 0)
|
if (process?.ExitCode == 0)
|
||||||
|
|||||||
@@ -12,11 +12,14 @@ public sealed class Options
|
|||||||
/// <summary>Имя исполняемого файла приложения для перезапуска (e.g., MyBot.exe).</summary>
|
/// <summary>Имя исполняемого файла приложения для перезапуска (e.g., MyBot.exe).</summary>
|
||||||
public required string AppExe { get; init; }
|
public required string AppExe { get; init; }
|
||||||
|
|
||||||
/// <summary>Необязательно: подождите миллисекунды перед перезапуском (льготный период).</summary>
|
/// <summary>Необязательно: подождите миллисекунды перед перезапуском.</summary>
|
||||||
public int RestartDelayMs { get; init; } = 500;
|
public int RestartDelayMs { get; init; } = 500;
|
||||||
|
|
||||||
|
/// <summary>Необязательно: подождите миллисекунды перед запуском обновления.</summary>
|
||||||
|
public int UpdateDelayMs { get; init; } = 500;
|
||||||
|
|
||||||
public static string Usage =>
|
public static string Usage =>
|
||||||
"Usage: Updater.exe --zip <path.zip> --installPath <dir> --appExe <file.exe> [--restartDelayMs <int>]";
|
"Usage: Updater.exe --zip <path.zip> --installPath <dir> --appExe <file.exe> [--restartDelayMs <int>] [--updateDelayMs <int>]";
|
||||||
|
|
||||||
/// <summary>Папрсинг CLI аргументов в Options.</summary>
|
/// <summary>Папрсинг CLI аргументов в Options.</summary>
|
||||||
public static Options Parse(string[] args)
|
public static Options Parse(string[] args)
|
||||||
@@ -42,7 +45,8 @@ public sealed class Options
|
|||||||
ZipPath = Path.GetFullPath(zip),
|
ZipPath = Path.GetFullPath(zip),
|
||||||
InstallPath = Path.GetFullPath(install),
|
InstallPath = Path.GetFullPath(install),
|
||||||
AppExe = exe,
|
AppExe = exe,
|
||||||
RestartDelayMs = dict.TryGetValue("restartDelayMs", out var d) && int.TryParse(d, out var n) ? n : 500
|
RestartDelayMs = dict.TryGetValue("restartDelayMs", out var d) && int.TryParse(d, out var n) ? n : 500,
|
||||||
|
UpdateDelayMs = dict.TryGetValue("updateDelayMs", out var d2) && int.TryParse(d2, out var n2) ? n2 : 500
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,9 @@ internal sealed class Program
|
|||||||
return ExitCodes.InvalidArgs;
|
return ExitCodes.InvalidArgs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Thread.Sleep(options.UpdateDelayMs);
|
||||||
|
|
||||||
var extractor = new ZipExtractor(logger);
|
var extractor = new ZipExtractor(logger);
|
||||||
var installer = new SafeFileInstaller(logger);
|
var installer = new SafeFileInstaller(logger);
|
||||||
var procMgr = new ProcessManager(logger);
|
var procMgr = new ProcessManager(logger);
|
||||||
|
|||||||
Reference in New Issue
Block a user