diff --git a/Assets/PatchKit Patcher/Scripts/AppUpdater/AppUpdater.cs b/Assets/PatchKit Patcher/Scripts/AppUpdater/AppUpdater.cs index 766c4cd3..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; @@ -71,13 +72,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 + .Where(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 + .Where(f => f.Status == FileIntegrityStatus.InvalidSize); + + int invalidSizeFilesCount = invalidSizeFiles.Count(); if (missingFilesCount + invalidSizeFilesCount == 0) { @@ -85,29 +88,30 @@ AppContentSummary latestVersionContentSummary return; } - var repairStrategy = new AppUpdaterRepairAndDiffStrategy(Context, _status, performDiff: false); - - 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) { 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); } } + 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");