Merge pull request #325 from Mbucari/master
Add app update to Avalonia Build
This commit is contained in:
commit
e093729707
5
.releaseindex.json
Normal file
5
.releaseindex.json
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"Linux":"Libation.\\d+.\\d+.\\d+-linux-chardonnay",
|
||||||
|
"WindowsClassic":"Libation.\\d+.\\d+.\\d+-win-classic.zip",
|
||||||
|
"WindowsAvalonia":"Libation.\\d+.\\d+.\\d+-win-chardonnay"
|
||||||
|
}
|
||||||
@ -309,10 +309,17 @@ namespace AppScaffolding
|
|||||||
LibraryCommands.BookUserDefinedItemCommitted += (_, books) => SearchEngineCommands.UpdateBooks(books);
|
LibraryCommands.BookUserDefinedItemCommitted += (_, books) => SearchEngineCommands.UpdateBooks(books);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UpgradeProperties GetLatestRelease()
|
public enum ReleaseIdentifier
|
||||||
|
{
|
||||||
|
WindowsClassic,
|
||||||
|
WindowsAvalonia,
|
||||||
|
Linux
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UpgradeProperties GetLatestRelease(ReleaseIdentifier releaseID = ReleaseIdentifier.WindowsClassic)
|
||||||
{
|
{
|
||||||
// timed out
|
// timed out
|
||||||
var latest = getLatestRelease(TimeSpan.FromSeconds(10));
|
var latest = getLatestRelease(TimeSpan.FromSeconds(10), releaseID);
|
||||||
if (latest is null)
|
if (latest is null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
@ -337,11 +344,11 @@ namespace AppScaffolding
|
|||||||
|
|
||||||
return new(zipUrl, latest.HtmlUrl, zip.Name, latestRelease);
|
return new(zipUrl, latest.HtmlUrl, zip.Name, latestRelease);
|
||||||
}
|
}
|
||||||
private static Octokit.Release getLatestRelease(TimeSpan timeout)
|
private static Octokit.Release getLatestRelease(TimeSpan timeout, ReleaseIdentifier releaseID)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var task = System.Threading.Tasks.Task.Run(() => getLatestRelease());
|
var task = getLatestRelease(releaseID);
|
||||||
if (task.Wait(timeout))
|
if (task.Wait(timeout))
|
||||||
return task.Result;
|
return task.Result;
|
||||||
|
|
||||||
@ -353,13 +360,20 @@ namespace AppScaffolding
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
private static Octokit.Release getLatestRelease()
|
private static async System.Threading.Tasks.Task<Octokit.Release> getLatestRelease(ReleaseIdentifier releaseID)
|
||||||
{
|
{
|
||||||
var gitHubClient = new Octokit.GitHubClient(new Octokit.ProductHeaderValue("Libation"));
|
var gitHubClient = new Octokit.GitHubClient(new Octokit.ProductHeaderValue("Libation"));
|
||||||
|
|
||||||
|
//Download the release index
|
||||||
|
var bts = await gitHubClient.Repository.Content.GetRawContent("Mbucari", "Libation", ".releaseindex.json");
|
||||||
|
var releaseIndex = JObject.Parse(System.Text.Encoding.ASCII.GetString(bts));
|
||||||
|
var regexPattern = releaseIndex.Value<string>(releaseID.ToString());
|
||||||
|
|
||||||
// https://octokitnet.readthedocs.io/en/latest/releases/
|
// https://octokitnet.readthedocs.io/en/latest/releases/
|
||||||
var releases = gitHubClient.Repository.Release.GetAll("rmcrackan", "Libation").GetAwaiter().GetResult();
|
var releases = await gitHubClient.Repository.Release.GetAll("rmcrackan", "Libation");
|
||||||
var latest = releases.First(r => !r.Draft && !r.Prerelease);
|
|
||||||
|
var regex = new System.Text.RegularExpressions.Regex(regexPattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase);
|
||||||
|
var latest = releases.FirstOrDefault(r => !r.Draft && !r.Prerelease && r.Assets.Any(a => regex.IsMatch(a.Name)));
|
||||||
return latest;
|
return latest;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -129,6 +129,9 @@
|
|||||||
<None Update="Libation.desktop">
|
<None Update="Libation.desktop">
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
</None>
|
</None>
|
||||||
|
<None Update="ZipExtractor.exe">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
@ -149,7 +149,11 @@ Libation.
|
|||||||
|
|
||||||
|
|
||||||
private static DialogResult ShowCoreAsync(Window owner, string message, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, bool saveAndRestorePosition = true)
|
private static DialogResult ShowCoreAsync(Window owner, string message, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, bool saveAndRestorePosition = true)
|
||||||
|
=> Avalonia.Threading.Dispatcher.UIThread.InvokeAsync(() => ShowCoreAsync2(owner, message, caption, buttons, icon, defaultButton, saveAndRestorePosition)).GetAwaiter().GetResult();
|
||||||
|
|
||||||
|
private static DialogResult ShowCoreAsync2(Window owner, string message, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, bool saveAndRestorePosition = true)
|
||||||
{
|
{
|
||||||
|
|
||||||
owner ??= (Application.Current.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime).MainWindow;
|
owner ??= (Application.Current.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime).MainWindow;
|
||||||
|
|
||||||
var dialog = new MessageBoxWindow(saveAndRestorePosition);
|
var dialog = new MessageBoxWindow(saveAndRestorePosition);
|
||||||
|
|||||||
@ -8,8 +8,7 @@ using LibationAvalonia.ViewModels;
|
|||||||
using LibationFileManager;
|
using LibationFileManager;
|
||||||
using DataLayer;
|
using DataLayer;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Threading.Tasks;
|
||||||
using LibationAvalonia.Dialogs;
|
|
||||||
|
|
||||||
namespace LibationAvalonia.Views
|
namespace LibationAvalonia.Views
|
||||||
{
|
{
|
||||||
@ -67,11 +66,88 @@ namespace LibationAvalonia.Views
|
|||||||
|
|
||||||
private async void MainWindow_Opened(object sender, EventArgs e)
|
private async void MainWindow_Opened(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
/*
|
#if !DEBUG
|
||||||
var charReplace = new EditReplacementChars();
|
if (App.IsWindows)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await Task.Run(checkForAndDownloadUpdate);
|
||||||
|
}
|
||||||
|
catch(Exception ex)
|
||||||
|
{
|
||||||
|
Serilog.Log.Logger.Error(ex, "An error occured while checking for app updates.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
await charReplace.ShowDialog(this);
|
private async Task checkForAndDownloadUpdate()
|
||||||
*/
|
{
|
||||||
|
AppScaffolding.UpgradeProperties upgradeProperties;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
upgradeProperties = AppScaffolding.LibationScaffolding.GetLatestRelease(AppScaffolding.LibationScaffolding.ReleaseIdentifier.WindowsAvalonia);
|
||||||
|
|
||||||
|
if (upgradeProperties is null)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Serilog.Log.Logger.Error(ex, "Failed to check for update");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (upgradeProperties.ZipUrl is null)
|
||||||
|
{
|
||||||
|
Serilog.Log.Logger.Information("Download link for new version not found");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Silently download the update in the background, save it to a temp file.
|
||||||
|
|
||||||
|
var zipPath = System.IO.Path.GetTempFileName();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
System.Net.Http.HttpClient cli = new();
|
||||||
|
using (var fs = System.IO.File.OpenWrite(zipPath))
|
||||||
|
{
|
||||||
|
using (var dlStream = await cli.GetStreamAsync(new Uri(upgradeProperties.ZipUrl)))
|
||||||
|
await dlStream.CopyToAsync(fs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Serilog.Log.Logger.Error(ex, "Failed to download the update: {pdate}", upgradeProperties.ZipUrl);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = MessageBox.Show($"{upgradeProperties.HtmlUrl}\r\n\r\nWould you like to upgrade now?", "New version available", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);
|
||||||
|
|
||||||
|
if (result != DialogResult.Yes)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var thisExe = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
|
||||||
|
var thisDir = System.IO.Path.GetDirectoryName(thisExe);
|
||||||
|
|
||||||
|
var args = $"--input {zipPath} --output {thisDir} --executable {thisExe}";
|
||||||
|
|
||||||
|
var zipExtractor = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "ZipExtractor.exe");
|
||||||
|
|
||||||
|
System.IO.File.Copy("ZipExtractor.exe", zipExtractor, overwrite: true);
|
||||||
|
|
||||||
|
var psi = new System.Diagnostics.ProcessStartInfo()
|
||||||
|
{
|
||||||
|
FileName = zipExtractor,
|
||||||
|
UseShellExecute = true,
|
||||||
|
Verb = "runas",
|
||||||
|
WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal,
|
||||||
|
Arguments = args,
|
||||||
|
CreateNoWindow = true
|
||||||
|
};
|
||||||
|
|
||||||
|
System.Diagnostics.Process.Start(psi);
|
||||||
|
Environment.Exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ProductsDisplay_Initialized1(object sender, EventArgs e)
|
public void ProductsDisplay_Initialized1(object sender, EventArgs e)
|
||||||
|
|||||||
BIN
Source/LibationAvalonia/ZipExtractor.exe
Normal file
BIN
Source/LibationAvalonia/ZipExtractor.exe
Normal file
Binary file not shown.
@ -170,7 +170,7 @@ namespace LibationWinForms
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
upgradeProperties = AppScaffolding.LibationScaffolding.GetLatestRelease();
|
upgradeProperties = AppScaffolding.LibationScaffolding.GetLatestRelease(AppScaffolding.LibationScaffolding.ReleaseIdentifier.WindowsClassic);
|
||||||
if (upgradeProperties is null)
|
if (upgradeProperties is null)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user