Files
ReleaseUpdater/Updater/Core/UpdaterApp.cs
FrigaT 72b0d60f3a
Some checks failed
CI / build-test (push) Failing after 55s
Release / pack-and-publish (release) Failing after 33s
доработано обновление
2025-12-12 09:23:48 +03:00

72 lines
2.1 KiB
C#

using ReleaseUpdater.Common;
namespace Updater.Core;
/// <summary>
/// Управляет потоком обновлений: извлечение, установка, перезапуск.
/// </summary>
public sealed class UpdaterApp
{
private readonly ILogger _log;
private readonly IExtractor _extractor;
private readonly IInstaller _installer;
private readonly IProcessManager _proc;
/// <inheritdoc/>
public UpdaterApp(ILogger log, IExtractor extractor, IInstaller installer, IProcessManager proc)
{
_log = log;
_extractor = extractor;
_installer = installer;
_proc = proc;
}
/// <summary>Запускает рабочий процесс обновления.</summary>
public int Run(Options opts)
{
var tempExtractDir = Path.Combine(Path.GetTempPath(), $"upd_extract_{Guid.NewGuid():N}");
Directory.CreateDirectory(tempExtractDir);
try
{
_extractor.Extract(opts.ZipPath, tempExtractDir);
}
catch (Exception ex)
{
_log.Error($"Extraction failed: {ex.Message}");
Cleanup(tempExtractDir);
_proc.StartApp(opts.InstallPath, opts.AppExe, opts.RestartDelayMs);
return ExitCodes.ExtractFailed;
}
try
{
_installer.Install(tempExtractDir, opts.InstallPath);
}
catch (Exception ex)
{
_log.Error($"Install failed: {ex.Message}");
Cleanup(tempExtractDir);
_proc.StartApp(opts.InstallPath, opts.AppExe, opts.RestartDelayMs);
return ExitCodes.InstallFailed;
}
Cleanup(tempExtractDir);
try
{
_proc.StartApp(opts.InstallPath, opts.AppExe, opts.RestartDelayMs);
return ExitCodes.Ok;
}
catch (Exception ex)
{
_log.Error($"Restart failed: {ex.Message}");
return ExitCodes.RestartFailed;
}
}
private static void Cleanup(string dir)
{
try { Directory.Delete(dir, true); } catch { /* ignore */ }
}
}