[AltStoreCore] Fixes incorrectly merging app versions for same app from different sources

This commit is contained in:
Riley Testut
2023-04-04 17:14:52 -05:00
committed by Magesh K
parent 7f2bd494b5
commit b88044757f
2 changed files with 16 additions and 5 deletions

View File

@@ -170,7 +170,7 @@ open class MergePolicy: RSTRelationshipPreservingMergePolicy
return
}
var sortedVersionsByAppBundleID = [String: NSOrderedSet]()
var sortedVersionsByGlobalAppID = [String: NSOrderedSet]()
var featuredAppIDsBySourceID = [String: [String]]()
for conflict in conflicts
@@ -194,9 +194,12 @@ open class MergePolicy: RSTRelationshipPreservingMergePolicy
appVersion.managedObjectContext?.delete(appVersion)
}
// Core Data _normally_ preserves the correct ordering of versions when merging,
// but just in case we cache the order and reorder the versions post-merge if needed.
sortedVersionsByAppBundleID[databaseObject.bundleIdentifier] = contextVersions
if let globallyUniqueID = contextApp.globallyUniqueID
{
// Core Data _normally_ preserves the correct ordering of versions when merging,
// but just in case we cache the order and reorder the versions post-merge if needed.
sortedVersionsByGlobalAppID[globallyUniqueID] = contextVersions
}
}
case let databaseObject as Source:
@@ -243,7 +246,8 @@ open class MergePolicy: RSTRelationshipPreservingMergePolicy
{
let appVersions: [AppVersion]
if let sortedAppVersions = sortedVersionsByAppBundleID[databaseObject.bundleIdentifier],
if let globallyUniqueID = databaseObject.globallyUniqueID,
let sortedAppVersions = sortedVersionsByGlobalAppID[globallyUniqueID],
let sortedAppVersionsArray = sortedAppVersions.array as? [String],
case let databaseVersions = databaseObject.versions.map({ $0.version }),
databaseVersions != sortedAppVersionsArray

View File

@@ -375,6 +375,13 @@ public extension StoreApp
return self._versions.firstObject as? AppVersion
}
var globallyUniqueID: String? {
guard let sourceIdentifier = self.sourceIdentifier else { return nil }
let globallyUniqueID = self.bundleIdentifier + "|" + sourceIdentifier
return globallyUniqueID
}
@nonobjc class func fetchRequest() -> NSFetchRequest<StoreApp>
{
return NSFetchRequest<StoreApp>(entityName: "StoreApp")