diff --git a/Plugins/Wox.Plugin.Sys/Images/checkupdate.png b/Plugins/Wox.Plugin.Sys/Images/checkupdate.png new file mode 100644 index 0000000000..955f6fdbb7 Binary files /dev/null and b/Plugins/Wox.Plugin.Sys/Images/checkupdate.png differ diff --git a/Plugins/Wox.Plugin.Sys/Main.cs b/Plugins/Wox.Plugin.Sys/Main.cs index e888dbb378..f6be3a4358 100644 --- a/Plugins/Wox.Plugin.Sys/Main.cs +++ b/Plugins/Wox.Plugin.Sys/Main.cs @@ -234,6 +234,20 @@ namespace Wox.Plugin.Sys context.API.GetTranslation("wox_plugin_sys_dlgtext_all_applicableplugins_reloaded")); return true; } + }, + new Result + { + Title = "Check For Update", + SubTitle = "Check for new Wox update", + IcoPath = "Images\\checkupdate.png", + Action = c => + { + Application.Current.MainWindow.Hide(); + context.API.CheckForNewUpdate(); + context.API.ShowMsg("Please wait...", + "Checking for new update"); + return true; + } } }); return results; diff --git a/Plugins/Wox.Plugin.Sys/Wox.Plugin.Sys.csproj b/Plugins/Wox.Plugin.Sys/Wox.Plugin.Sys.csproj index 09a1e761fa..ffdfa59720 100644 --- a/Plugins/Wox.Plugin.Sys/Wox.Plugin.Sys.csproj +++ b/Plugins/Wox.Plugin.Sys/Wox.Plugin.Sys.csproj @@ -71,9 +71,15 @@ + + PreserveNewest + PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/Wox.Core/Updater.cs b/Wox.Core/Updater.cs index 971995f5ee..9262d78f4d 100644 --- a/Wox.Core/Updater.cs +++ b/Wox.Core/Updater.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Net; using System.Net.Http; @@ -10,9 +10,11 @@ using JetBrains.Annotations; using Squirrel; using Newtonsoft.Json; using Wox.Core.Resource; +using Wox.Plugin.SharedCommands; using Wox.Infrastructure; using Wox.Infrastructure.Http; using Wox.Infrastructure.Logger; +using System.IO; namespace Wox.Core { @@ -25,14 +27,14 @@ namespace Wox.Core GitHubRepository = gitHubRepository; } - public async Task UpdateApp() + public async Task UpdateApp(bool silentIfLatestVersion = true) { - UpdateManager m; - UpdateInfo u; + UpdateManager updateManager; + UpdateInfo newUpdateInfo; try { - m = await GitHubUpdateManager(GitHubRepository); + updateManager = await GitHubUpdateManager(GitHubRepository); } catch (Exception e) when (e is HttpRequestException || e is WebException || e is SocketException) { @@ -43,42 +45,61 @@ namespace Wox.Core try { // UpdateApp CheckForUpdate will return value only if the app is squirrel installed - u = await m.CheckForUpdate().NonNull(); + newUpdateInfo = await updateManager.CheckForUpdate().NonNull(); } catch (Exception e) when (e is HttpRequestException || e is WebException || e is SocketException) { Log.Exception($"|Updater.UpdateApp|Check your connection and proxy settings to api.github.com.", e); - m.Dispose(); + updateManager.Dispose(); return; } - var fr = u.FutureReleaseEntry; - var cr = u.CurrentlyInstalledVersion; - Log.Info($"|Updater.UpdateApp|Future Release <{fr.Formatted()}>"); - if (fr.Version > cr.Version) + var newReleaseVersion = Version.Parse(newUpdateInfo.FutureReleaseEntry.Version.ToString()); + var currentVersion = Version.Parse(Constant.Version); + + Log.Info($"|Updater.UpdateApp|Future Release <{newUpdateInfo.FutureReleaseEntry.Formatted()}>"); + + if (newReleaseVersion <= currentVersion) { - try - { - await m.DownloadReleases(u.ReleasesToApply); - } - catch (Exception e) when (e is HttpRequestException || e is WebException || e is SocketException) - { - Log.Exception($"|Updater.UpdateApp|Check your connection and proxy settings to github-cloud.s3.amazonaws.com.", e); - m.Dispose(); - return; - } - - await m.ApplyReleases(u); - await m.CreateUninstallerRegistryEntry(); - - var newVersionTips = this.NewVersinoTips(fr.Version.ToString()); - - MessageBox.Show(newVersionTips); - Log.Info($"|Updater.UpdateApp|Update success:{newVersionTips}"); + if (!silentIfLatestVersion) + MessageBox.Show("You already have the latest Wox version"); + updateManager.Dispose(); + return; } + try + { + await updateManager.DownloadReleases(newUpdateInfo.ReleasesToApply); + } + catch (Exception e) when (e is HttpRequestException || e is WebException || e is SocketException) + { + Log.Exception($"|Updater.UpdateApp|Check your connection and proxy settings to github-cloud.s3.amazonaws.com.", e); + updateManager.Dispose(); + return; + } + + await updateManager.ApplyReleases(newUpdateInfo); + + if (Constant.IsPortableMode) + { + var targetDestination = updateManager.RootAppDirectory + $"\\app-{newReleaseVersion.ToString()}\\{Constant.PortableFolderName}"; + FilesFolders.Copy(Constant.PortableDataPath, targetDestination); + if (!FilesFolders.VerifyBothFolderFilesEqual(Constant.PortableDataPath, targetDestination)) + MessageBox.Show(string.Format("Wox was not able to move your user profile data to the new update version. Please manually" + + "move your profile data folder from {0} to {1}", Constant.PortableDataPath, targetDestination)); + } + else + { + await updateManager.CreateUninstallerRegistryEntry(); + } + + var newVersionTips = NewVersinoTips(newReleaseVersion.ToString()); + + MessageBox.Show(newVersionTips); + Log.Info($"|Updater.UpdateApp|Update success:{newVersionTips}"); + // always dispose UpdateManager - m.Dispose(); + updateManager.Dispose(); } [UsedImplicitly] diff --git a/Wox.Infrastructure/Wox.cs b/Wox.Infrastructure/Wox.cs index 396ee0bb1a..d09e7b904c 100644 --- a/Wox.Infrastructure/Wox.cs +++ b/Wox.Infrastructure/Wox.cs @@ -7,12 +7,22 @@ namespace Wox.Infrastructure { public static class Constant { + public const string Wox = "Wox"; + public const string Plugins = "Plugins"; + + private static readonly Assembly Assembly = Assembly.GetExecutingAssembly(); + public static readonly string ProgramDirectory = Directory.GetParent(Assembly.Location.NonNull()).ToString(); + public static readonly string ExecutablePath = Path.Combine(ProgramDirectory, Wox + ".exe"); + + public static bool IsPortableMode; + public const string PortableFolderName = "UserData"; + public static string PortableDataPath = Path.Combine(ProgramDirectory, PortableFolderName); public static string DetermineDataDirectory() { - string portableDataPath = Path.Combine(ProgramDirectory, "UserData"); - if (Directory.Exists(portableDataPath)) + if (Directory.Exists(PortableDataPath)) { - return portableDataPath; + IsPortableMode = true; + return PortableDataPath; } else { @@ -20,12 +30,6 @@ namespace Wox.Infrastructure } } - public const string Wox = "Wox"; - public const string Plugins = "Plugins"; - - private static readonly Assembly Assembly = Assembly.GetExecutingAssembly(); - public static readonly string ProgramDirectory = Directory.GetParent(Assembly.Location.NonNull()).ToString(); - public static readonly string ExecutablePath = Path.Combine(ProgramDirectory, Wox + ".exe"); public static readonly string DataDirectory = DetermineDataDirectory(); public static readonly string PluginsDirectory = Path.Combine(DataDirectory, Plugins); public static readonly string PreinstalledDirectory = Path.Combine(ProgramDirectory, Plugins); diff --git a/Wox.Plugin/IPublicAPI.cs b/Wox.Plugin/IPublicAPI.cs index 8dc838963c..754b76d36b 100644 --- a/Wox.Plugin/IPublicAPI.cs +++ b/Wox.Plugin/IPublicAPI.cs @@ -70,6 +70,11 @@ namespace Wox.Plugin /// void ReloadAllPluginData(); + /// + /// Check for new Wox update + /// + void CheckForNewUpdate(); + /// /// Show message box /// diff --git a/Wox.Plugin/SharedCommands/FilesFolders.cs b/Wox.Plugin/SharedCommands/FilesFolders.cs new file mode 100644 index 0000000000..584a83bc6d --- /dev/null +++ b/Wox.Plugin/SharedCommands/FilesFolders.cs @@ -0,0 +1,101 @@ +using System; +using System.IO; +using System.Windows; + +namespace Wox.Plugin.SharedCommands +{ + public static class FilesFolders + { + public static void Copy(this string sourcePath, string targetPath) + { + // Get the subdirectories for the specified directory. + DirectoryInfo dir = new DirectoryInfo(sourcePath); + + if (!dir.Exists) + { + throw new DirectoryNotFoundException( + "Source directory does not exist or could not be found: " + + sourcePath); + } + + try + { + DirectoryInfo[] dirs = dir.GetDirectories(); + // If the destination directory doesn't exist, create it. + if (!Directory.Exists(targetPath)) + { + Directory.CreateDirectory(targetPath); + } + + // Get the files in the directory and copy them to the new location. + FileInfo[] files = dir.GetFiles(); + foreach (FileInfo file in files) + { + string temppath = Path.Combine(targetPath, file.Name); + file.CopyTo(temppath, false); + } + + // Recursively copy subdirectories by calling itself on each subdirectory until there are no more to copy + foreach (DirectoryInfo subdir in dirs) + { + string temppath = Path.Combine(targetPath, subdir.Name); + Copy(subdir.FullName, temppath); + } + } + catch (Exception e) + { +#if DEBUG + throw e; +#else + MessageBox.Show(string.Format("Copying path {0} has failed, it will now be deleted for consistency", targetPath)); + RemoveFolder(targetPath); +#endif + } + + } + + public static bool VerifyBothFolderFilesEqual(this string fromPath, string toPath) + { + try + { + var fromDir = new DirectoryInfo(fromPath); + var toDir = new DirectoryInfo(toPath); + + if (fromDir.GetFiles("*", SearchOption.AllDirectories).Length != toDir.GetFiles("*", SearchOption.AllDirectories).Length) + return false; + + if (fromDir.GetDirectories("*", SearchOption.AllDirectories).Length != toDir.GetDirectories("*", SearchOption.AllDirectories).Length) + return false; + + return true; + } + catch (Exception e) + { +#if DEBUG + throw e; +#else + MessageBox.Show(string.Format("Unable to verify folders and files between {0} and {1}", fromPath, toPath)); + return false; +#endif + } + + } + + public static void RemoveFolder(this string path) + { + try + { + if (Directory.Exists(path)) + Directory.Delete(path, true); + } + catch (Exception e) + { +#if DEBUG + throw e; +#else + MessageBox.Show(string.Format("Not able to delete folder {0}, please go to the location and manually delete it", path)); +#endif + } + } + } +} diff --git a/Wox.Plugin/Wox.Plugin.csproj b/Wox.Plugin/Wox.Plugin.csproj index ceba2bbf07..b0b457e988 100644 --- a/Wox.Plugin/Wox.Plugin.csproj +++ b/Wox.Plugin/Wox.Plugin.csproj @@ -65,6 +65,7 @@ + diff --git a/Wox/PublicAPIInstance.cs b/Wox/PublicAPIInstance.cs index 314fc13b67..58915f87b2 100644 --- a/Wox/PublicAPIInstance.cs +++ b/Wox/PublicAPIInstance.cs @@ -5,6 +5,7 @@ using System.Net; using System.Threading.Tasks; using System.Windows; using Squirrel; +using Wox.Core; using Wox.Core.Plugin; using Wox.Core.Resource; using Wox.Helper; @@ -65,6 +66,11 @@ namespace Wox UpdateManager.RestartApp(); } + public void CheckForNewUpdate() + { + _settingsVM.UpdateApp(); + } + public void SaveAppAllSettings() { _mainVM.Save(); diff --git a/Wox/SettingWindow.xaml b/Wox/SettingWindow.xaml index a6f23814ff..1eddd8ab6a 100644 --- a/Wox/SettingWindow.xaml +++ b/Wox/SettingWindow.xaml @@ -33,7 +33,8 @@ - + @@ -51,8 +52,7 @@ - + diff --git a/Wox/ViewModel/SettingWindowViewModel.cs b/Wox/ViewModel/SettingWindowViewModel.cs index 923e456b05..c93cdd413b 100644 --- a/Wox/ViewModel/SettingWindowViewModel.cs +++ b/Wox/ViewModel/SettingWindowViewModel.cs @@ -44,7 +44,7 @@ namespace Wox.ViewModel public async void UpdateApp() { - await _updater.UpdateApp(); + await _updater.UpdateApp(false); } public void Save()