diff --git a/.semver.txt b/.semver.txt index b668c3b..8fc77d0 100644 --- a/.semver.txt +++ b/.semver.txt @@ -1 +1 @@ -1.0.16 +1.0.17 diff --git a/src/JiraTimeBot/JiraTimeBot.csproj b/src/JiraTimeBot/JiraTimeBot.csproj index 7b80173..ca04000 100644 --- a/src/JiraTimeBot/JiraTimeBot.csproj +++ b/src/JiraTimeBot/JiraTimeBot.csproj @@ -61,6 +61,7 @@ + diff --git a/src/JiraTimeBot/Properties/AssemblyInfo.cs b/src/JiraTimeBot/Properties/AssemblyInfo.cs index 2f42b80..1b85309 100644 --- a/src/JiraTimeBot/Properties/AssemblyInfo.cs +++ b/src/JiraTimeBot/Properties/AssemblyInfo.cs @@ -1,31 +1,31 @@ -using System.Reflection; -using System.Runtime.InteropServices; -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("JiraTimeBot")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("JiraTimeBot")] -[assembly: AssemblyCopyright("Copyright © 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("f3b89316-c38c-4ce6-9d88-0b1373cfba1a")] -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("1.0.16")] -[assembly: AssemblyFileVersion("1.0.16")] -[assembly: AssemblyInformationalVersion("1.0.16")] +using System.Reflection; +using System.Runtime.InteropServices; +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("JiraTimeBot")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("JiraTimeBot")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("f3b89316-c38c-4ce6-9d88-0b1373cfba1a")] +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.17")] +[assembly: AssemblyFileVersion("1.0.17")] +[assembly: AssemblyInformationalVersion("1.0.17")] diff --git a/src/JiraTimeBot/UI/frmMain.Designer.cs b/src/JiraTimeBot/UI/frmMain.Designer.cs index fa52b07..7afbfea 100644 --- a/src/JiraTimeBot/UI/frmMain.Designer.cs +++ b/src/JiraTimeBot/UI/frmMain.Designer.cs @@ -114,7 +114,7 @@ // // tmrUpdate // - this.tmrUpdate.Interval = 1000; + this.tmrUpdate.Interval = 10000; this.tmrUpdate.Tick += new System.EventHandler(this.tmrUpdate_Tick); // // frmMain diff --git a/src/JiraTimeBot/UI/frmMain.cs b/src/JiraTimeBot/UI/frmMain.cs index 055a8f1..ab36612 100644 --- a/src/JiraTimeBot/UI/frmMain.cs +++ b/src/JiraTimeBot/UI/frmMain.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.IO.Compression; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; @@ -189,23 +190,86 @@ namespace JiraTimeBotForm.UI private void tmrUpdate_Tick(object sender, EventArgs e) { - tmrUpdate.Interval = 8 * 60 * 60 * 1000; - - var checker = new UpdateChecker(); - var release = checker.GetRelease(); - if (release == null) + try { - return; + tmrUpdate.Interval = 8 * 60 * 60 * 1000; + + var checker = new UpdateChecker(); + var release = checker.GetRelease(); + if (release == null) + { + return; + } + + var gitVersionStr = checker.GetLatestVersion(release); + var gitVersion = new Version(gitVersionStr); + var appVersion = new Version(Application.ProductVersion); + + if (gitVersion > appVersion) + { + var downloadUrl = checker.GetDownloadUrl(release); + _log.Info($"Доступна новая версия: {gitVersion} {downloadUrl}"); + + var success = checker.DownloadFile(downloadUrl); + if (!success) + { + return; + } + + var result = InstallUpdate(gitVersion); + if (result) + { + //если обновились - отключаем до рестарта + tmrUpdate.Enabled = false; + } + } } - - var gitVersionStr = checker.GetLatestVersion(release); - var gitVersion = new Version(gitVersionStr); - var appVersion = new Version(Application.ProductVersion); - - if (gitVersion > appVersion) + catch (Exception ex) { - var downloadUrl = checker.GetDownloadUrl(release); - _log.Info($"Доступна новая версия: {gitVersion} {downloadUrl}"); + //в процессе обновления ни при каком раскладе мы не должны уложить бота. + _log.Error($"Фатальная ошибка в процессе обновления: {ex.Message}"); + } + } + + private bool InstallUpdate(Version gitVersion) + { + try + { + _log.Info($"Устанавливаю обновление до версии {gitVersion}."); + //Rename he executing file + System.IO.FileInfo appFile = new System.IO.FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location); + var bkpDir = Path.Combine(appFile.DirectoryName, "bkp"); + if (!Directory.Exists(bkpDir)) + { + Directory.CreateDirectory(bkpDir); + } + + using (ZipArchive archive = ZipFile.OpenRead(Path.Combine(appFile.DirectoryName, "update.zip"))) + { + foreach (ZipArchiveEntry entry in archive.Entries) + { + var zipEntryPath = Path.Combine(appFile.DirectoryName, entry.FullName); + if (File.Exists(zipEntryPath)) + { + System.IO.FileInfo zipEntryFile = new System.IO.FileInfo(zipEntryPath); + if (File.Exists(bkpDir + "\\" + zipEntryFile.Name)) + { + File.Delete(bkpDir + "\\" + zipEntryFile.Name); + } + System.IO.File.Move(zipEntryFile.FullName, bkpDir + "\\" + zipEntryFile.Name); + } + + entry.ExtractToFile(zipEntryPath); + } + } + + _log.Info("Обновление установлено. Перезапустите программу для применения изменений."); + return true; + } + catch (Exception) + { + _log.Error($"Что-то пошло не так при обновлении."); + return false; } } } diff --git a/src/JiraTimeBot/Update/UpdateChecker.cs b/src/JiraTimeBot/Update/UpdateChecker.cs index a559f97..bcd0a22 100644 --- a/src/JiraTimeBot/Update/UpdateChecker.cs +++ b/src/JiraTimeBot/Update/UpdateChecker.cs @@ -38,12 +38,22 @@ namespace JiraTimeBotForm.Update return release; } - public void DownloadFile(string url) + public bool DownloadFile(string url) { - using (var client = new WebClient()) + try { - client.Headers.Add("User-Agent", "Mozilla/5.0 (X11; Linux i686; rv:64.0) Gecko/20100101 Firefox/64.0"); - client.DownloadFile(url, "update.zip"); + + using (var client = new WebClient()) + { + client.Headers.Add("User-Agent", + "Mozilla/5.0 (X11; Linux i686; rv:64.0) Gecko/20100101 Firefox/64.0"); + client.DownloadFile(url, "update.zip"); + return true; + } + } + catch (Exception) + { + return false; } }