From cc6453f006544a5092bc975ef1a026955a939e7a Mon Sep 17 00:00:00 2001 From: Dzejkop Date: Thu, 7 Jun 2018 14:46:55 +0200 Subject: [PATCH 1/2] Uninstalling if cost of repair is larger than cost of content --- .../Scripts/AppUpdater/AppUpdater.cs | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/Assets/PatchKit Patcher/Scripts/AppUpdater/AppUpdater.cs b/Assets/PatchKit Patcher/Scripts/AppUpdater/AppUpdater.cs index 766c4cd3..63aa7bc2 100644 --- a/Assets/PatchKit Patcher/Scripts/AppUpdater/AppUpdater.cs +++ b/Assets/PatchKit Patcher/Scripts/AppUpdater/AppUpdater.cs @@ -71,13 +71,15 @@ AppContentSummary latestVersionContentSummary checkIntegrity.Prepare(_status); checkIntegrity.Execute(cancellationToken); - int missingFilesCount = checkIntegrity.Results.Files - .Select(f => f.Status == FileIntegrityStatus.MissingData) - .Count(); + var missingFiles = checkIntegrity.Results.Files + .Select(f => f.Status == FileIntegrityStatus.MissingData); + + int missingFilesCount = missingFiles.Count(); - int invalidSizeFilesCount = checkIntegrity.Results.Files - .Select(f => f.Status == FileIntegrityStatus.InvalidSize) - .Count(); + var invalidSizeFiles = checkIntegrity.Results.Files + .Select(f => f.Status == FileIntegrityStatus.InvalidSize); + + int invalidSizeFilesCount = invalidSizeFiles.Count(); if (missingFilesCount + invalidSizeFilesCount == 0) { @@ -85,8 +87,6 @@ AppContentSummary latestVersionContentSummary return; } - var repairStrategy = new AppUpdaterRepairAndDiffStrategy(Context, _status, performDiff: false); - double repairCost = (missingFilesCount + invalidSizeFilesCount) * 2; if (isNewVersionAvailable) { @@ -100,11 +100,15 @@ AppContentSummary latestVersionContentSummary if (repairCost < contentSize) { DebugLogger.Log(string.Format("Repair cost {0} is smaller than content cost {1}, repairing...", repairCost, contentSize)); + IAppUpdaterStrategy repairStrategy = _strategyResolver.Create(StrategyType.RepairAndDiff, Context); repairStrategy.Update(cancellationToken); } else { - DebugLogger.Log("Content cost is smaller than repair."); + DebugLogger.Log("Content cost is smaller than repair. Uninstalling to prepare for content strategy."); + IUninstallCommand uninstall = commandFactory.CreateUninstallCommand(Context); + uninstall.Prepare(_status); + uninstall.Execute(cancellationToken); } } From dbb60eac2aa28e25501876e40c503b054b8090ae Mon Sep 17 00:00:00 2001 From: Dzejkop Date: Thu, 7 Jun 2018 16:02:04 +0200 Subject: [PATCH 2/2] Calculating valid repair cost in pre update --- .../Scripts/AppUpdater/AppUpdater.cs | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Assets/PatchKit Patcher/Scripts/AppUpdater/AppUpdater.cs b/Assets/PatchKit Patcher/Scripts/AppUpdater/AppUpdater.cs index 63aa7bc2..c9537c59 100644 --- a/Assets/PatchKit Patcher/Scripts/AppUpdater/AppUpdater.cs +++ b/Assets/PatchKit Patcher/Scripts/AppUpdater/AppUpdater.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Linq.Expressions; using System.Threading; +using System.Collections.Generic; using PatchKit.Unity.Patcher.Cancellation; using PatchKit.Unity.Patcher.Debug; using PatchKit.Unity.Patcher.AppUpdater.Commands; @@ -72,12 +73,12 @@ AppContentSummary latestVersionContentSummary checkIntegrity.Execute(cancellationToken); var missingFiles = checkIntegrity.Results.Files - .Select(f => f.Status == FileIntegrityStatus.MissingData); + .Where(f => f.Status == FileIntegrityStatus.MissingData); int missingFilesCount = missingFiles.Count(); var invalidSizeFiles = checkIntegrity.Results.Files - .Select(f => f.Status == FileIntegrityStatus.InvalidSize); + .Where(f => f.Status == FileIntegrityStatus.InvalidSize); int invalidSizeFilesCount = invalidSizeFiles.Count(); @@ -87,15 +88,7 @@ AppContentSummary latestVersionContentSummary return; } - double repairCost = (missingFilesCount + invalidSizeFilesCount) * 2; - if (isNewVersionAvailable) - { - repairCost *= latestVersionContentSummary.Chunks.Size; - } - else - { - repairCost *= installedVersionContentSummary.Chunks.Size; - } + double repairCost = CalculateRepairCost(installedVersionContentSummary, missingFiles.Concat(invalidSizeFiles)); if (repairCost < contentSize) { @@ -112,6 +105,13 @@ AppContentSummary latestVersionContentSummary } } + private long CalculateRepairCost(AppContentSummary contentSummary, IEnumerable filesToRepair) + { + return filesToRepair + .Select(f => contentSummary.Files.FirstOrDefault(e => e.Path == f.FileName)) + .Sum(f => f.Size); + } + public void Update(CancellationToken cancellationToken) { Assert.MethodCalledOnlyOnce(ref _updateHasBeenCalled, "Update");