Browse Source

Improved compatibility checking code

Krzysztof Krysiński 5 months ago
parent
commit
228d8ff8a0
1 changed files with 41 additions and 22 deletions
  1. 41 22
      src/PixiEditor.UpdateModule/UpdateChecker.cs

+ 41 - 22
src/PixiEditor.UpdateModule/UpdateChecker.cs

@@ -19,7 +19,8 @@ public class UpdateChecker
     public ReleaseInfo LatestReleaseInfo { get; private set; }
     public ReleaseInfo LatestReleaseInfo { get; private set; }
 
 
     private UpdateChannel _channel;
     private UpdateChannel _channel;
-    public UpdateChannel Channel 
+
+    public UpdateChannel Channel
     {
     {
         get => _channel;
         get => _channel;
         set
         set
@@ -45,7 +46,7 @@ public class UpdateChecker
     {
     {
         return ExtractVersionString(originalVer) != ExtractVersionString(newVer);
         return ExtractVersionString(originalVer) != ExtractVersionString(newVer);
     }
     }
-    
+
     /// <summary>
     /// <summary>
     ///     Checks if originalVer is smaller than newVer
     ///     Checks if originalVer is smaller than newVer
     /// </summary>
     /// </summary>
@@ -59,24 +60,17 @@ public class UpdateChecker
 
 
         if (normalizedOriginal == normalizedNew) return false;
         if (normalizedOriginal == normalizedNew) return false;
 
 
-        bool parsed = TryParseToFloatVersion(normalizedOriginal, out float orgFloat);
-        if (!parsed) throw new Exception($"Couldn't parse version {originalVer} to float.");
-
-        parsed = TryParseToFloatVersion(normalizedNew, out float newFloat);
-        if (!parsed) throw new Exception($"Couldn't parse version {newVer} to float.");
-
-        return orgFloat < newFloat;
-    }
+        if (!Version.TryParse(normalizedOriginal, out Version original))
+        {
+            throw new ArgumentException($"Invalid version string: {normalizedOriginal}");
+        }
 
 
-    private static bool TryParseToFloatVersion(string normalizedString, out float ver)
-    {
-        if (string.IsNullOrEmpty(normalizedString))
+        if (!Version.TryParse(normalizedNew, out Version newVersion))
         {
         {
-            ver = 0;
-            return false;
+            throw new ArgumentException($"Invalid version string: {normalizedNew}");
         }
         }
-        
-        return float.TryParse(normalizedString.Replace(".", string.Empty).Insert(1, "."), NumberStyles.Any, CultureInfo.InvariantCulture, out ver);
+
+        return original < newVersion;
     }
     }
 
 
     public async Task<bool> CheckUpdateAvailable()
     public async Task<bool> CheckUpdateAvailable()
@@ -89,20 +83,45 @@ public class UpdateChecker
     {
     {
         if (latestRelease == null || string.IsNullOrEmpty(latestRelease.TagName)) return false;
         if (latestRelease == null || string.IsNullOrEmpty(latestRelease.TagName)) return false;
         if (CurrentVersionTag == null) return false;
         if (CurrentVersionTag == null) return false;
-        
+
         return latestRelease.WasDataFetchSuccessful && VersionDifferent(CurrentVersionTag, latestRelease.TagName);
         return latestRelease.WasDataFetchSuccessful && VersionDifferent(CurrentVersionTag, latestRelease.TagName);
     }
     }
 
 
     public bool IsUpdateCompatible(string[] incompatibleVersions)
     public bool IsUpdateCompatible(string[] incompatibleVersions)
     {
     {
-        return !incompatibleVersions.Select(x => x.Trim()).Contains(ExtractVersionString(CurrentVersionTag));
+        string extractedVersion = ExtractVersionString(CurrentVersionTag);
+        bool containsVersion = incompatibleVersions.Select(x => x.Trim()).Contains(extractedVersion);
+        if (containsVersion)
+        {
+            return false;
+        }
+
+        Version biggestIncompatibleVersion = incompatibleVersions
+            .Select(x => Version.TryParse(ExtractVersionString(x), out Version version) ? version : null)
+            .Where(x => x != null)
+            .OrderByDescending(x => x)
+            .FirstOrDefault();
+
+        if (biggestIncompatibleVersion == null)
+        {
+            return true;
+        }
+
+        Version currentVersion = Version.TryParse(ExtractVersionString(CurrentVersionTag), out Version version) ? version : null;
+
+        bool biggestVersionBiggerThanCurrent =
+            biggestIncompatibleVersion >= currentVersion;
+
+        return !biggestVersionBiggerThanCurrent;
     }
     }
 
 
     public async Task<bool> IsUpdateCompatible()
     public async Task<bool> IsUpdateCompatible()
     {
     {
         string[] incompatibleVersions = await GetUpdateIncompatibleVersionsAsync(LatestReleaseInfo.TagName);
         string[] incompatibleVersions = await GetUpdateIncompatibleVersionsAsync(LatestReleaseInfo.TagName);
         bool isDowngrading = VersionSmaller(LatestReleaseInfo.TagName, CurrentVersionTag);
         bool isDowngrading = VersionSmaller(LatestReleaseInfo.TagName, CurrentVersionTag);
-        return IsUpdateCompatible(incompatibleVersions) && !isDowngrading; // Incompatible.json doesn't support backwards compatibility, thus downgrading always means update is not compatble
+        return
+            IsUpdateCompatible(incompatibleVersions) &&
+            !isDowngrading; // Incompatible.json doesn't support backwards compatibility, thus downgrading always means update is not compatble
     }
     }
 
 
     public async Task<string[]> GetUpdateIncompatibleVersionsAsync(string tag)
     public async Task<string[]> GetUpdateIncompatibleVersionsAsync(string tag)
@@ -140,7 +159,7 @@ public class UpdateChecker
     private static string ExtractVersionString(string versionString)
     private static string ExtractVersionString(string versionString)
     {
     {
         if (string.IsNullOrEmpty(versionString)) return string.Empty;
         if (string.IsNullOrEmpty(versionString)) return string.Empty;
-        
+
         for (int i = 0; i < versionString.Length; i++)
         for (int i = 0; i < versionString.Length; i++)
         {
         {
             if (!char.IsDigit(versionString[i]) && versionString[i] != '.')
             if (!char.IsDigit(versionString[i]) && versionString[i] != '.')
@@ -148,7 +167,7 @@ public class UpdateChecker
                 return versionString[..i];
                 return versionString[..i];
             }
             }
         }
         }
-        
+
         return versionString;
         return versionString;
     }
     }
 }
 }