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()