Skip to content

Commit e68fb66

Browse files
authored
Merge pull request #55 from patchkit-net/feautre/882
Uninstalling if cost of repair is larger than cost of content
2 parents bec7d10 + dbb60ea commit e68fb66

File tree

1 file changed

+22
-18
lines changed

1 file changed

+22
-18
lines changed

Assets/PatchKit Patcher/Scripts/AppUpdater/AppUpdater.cs

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Linq;
44
using System.Linq.Expressions;
55
using System.Threading;
6+
using System.Collections.Generic;
67
using PatchKit.Unity.Patcher.Cancellation;
78
using PatchKit.Unity.Patcher.Debug;
89
using PatchKit.Unity.Patcher.AppUpdater.Commands;
@@ -71,43 +72,46 @@ AppContentSummary latestVersionContentSummary
7172
checkIntegrity.Prepare(_status);
7273
checkIntegrity.Execute(cancellationToken);
7374

74-
int missingFilesCount = checkIntegrity.Results.Files
75-
.Select(f => f.Status == FileIntegrityStatus.MissingData)
76-
.Count();
75+
var missingFiles = checkIntegrity.Results.Files
76+
.Where(f => f.Status == FileIntegrityStatus.MissingData);
77+
78+
int missingFilesCount = missingFiles.Count();
7779

78-
int invalidSizeFilesCount = checkIntegrity.Results.Files
79-
.Select(f => f.Status == FileIntegrityStatus.InvalidSize)
80-
.Count();
80+
var invalidSizeFiles = checkIntegrity.Results.Files
81+
.Where(f => f.Status == FileIntegrityStatus.InvalidSize);
82+
83+
int invalidSizeFilesCount = invalidSizeFiles.Count();
8184

8285
if (missingFilesCount + invalidSizeFilesCount == 0)
8386
{
8487
DebugLogger.Log("No missing or invalid size files.");
8588
return;
8689
}
8790

88-
var repairStrategy = new AppUpdaterRepairAndDiffStrategy(Context, _status, performDiff: false);
89-
90-
double repairCost = (missingFilesCount + invalidSizeFilesCount) * 2;
91-
if (isNewVersionAvailable)
92-
{
93-
repairCost *= latestVersionContentSummary.Chunks.Size;
94-
}
95-
else
96-
{
97-
repairCost *= installedVersionContentSummary.Chunks.Size;
98-
}
91+
double repairCost = CalculateRepairCost(installedVersionContentSummary, missingFiles.Concat(invalidSizeFiles));
9992

10093
if (repairCost < contentSize)
10194
{
10295
DebugLogger.Log(string.Format("Repair cost {0} is smaller than content cost {1}, repairing...", repairCost, contentSize));
96+
IAppUpdaterStrategy repairStrategy = _strategyResolver.Create(StrategyType.RepairAndDiff, Context);
10397
repairStrategy.Update(cancellationToken);
10498
}
10599
else
106100
{
107-
DebugLogger.Log("Content cost is smaller than repair.");
101+
DebugLogger.Log("Content cost is smaller than repair. Uninstalling to prepare for content strategy.");
102+
IUninstallCommand uninstall = commandFactory.CreateUninstallCommand(Context);
103+
uninstall.Prepare(_status);
104+
uninstall.Execute(cancellationToken);
108105
}
109106
}
110107

108+
private long CalculateRepairCost(AppContentSummary contentSummary, IEnumerable<FileIntegrity> filesToRepair)
109+
{
110+
return filesToRepair
111+
.Select(f => contentSummary.Files.FirstOrDefault(e => e.Path == f.FileName))
112+
.Sum(f => f.Size);
113+
}
114+
111115
public void Update(CancellationToken cancellationToken)
112116
{
113117
Assert.MethodCalledOnlyOnce(ref _updateHasBeenCalled, "Update");

0 commit comments

Comments
 (0)